This is the code for the statistical analysis for “Vowel Acoustics as Predictors of Speech Intelligibility in Dysarthria.”
Loading Packages
library(rio)
library(tidyverse)
library(irr) # install.packages('irr')
library(performance)
library(car)
library(ggpubr)
library("Hmisc") # install.packages('Hmisc')
library(ggridges)
library(furniture) # install.packages('furniture')
library(gt)
library(patchwork)
library(ks)
library(emuR) # install.packages('emuR')
library(geomtextpath) # remotes::install_github("AllanCameron/geomtextpath")
Upload Datasets
Reliability <- rio::import("Prepped Data/Reliability Data.csv")
AcousticData <- rio::import("Prepped Data/AcousticMeasures.csv") %>%
dplyr::mutate(intDiff = VAS - transAcc)
AcousticData <- AcousticData %>%
dplyr::filter(!grepl("_rel", Speaker)) %>%
dplyr::select(c(Speaker, Sex, Etiology, vowel_ED_b, VSA_b, Hull_b, Hull_bVSD_25, Hull_bVSD_50, Hull_bVSD_75, VAS, transAcc)) %>%
dplyr::mutate(Etiology = as.factor(Etiology),
Sex = as.factor(Sex),
Speaker = as.factor(Speaker))
Listeners <- rio::import("Prepped Data/Listener_Demographics.csv") %>%
dplyr::select(!c(StartDate:proloficID, Q2.4_6_TEXT, Q3.2_8_TEXT, AudioCheck:EP3))
Listeners$race[Listeners$Q3.3_7_TEXT == "Native American/ African amercing"] <- "Biracial or Multiracial"
Inter-rater Reliability
Two raters (the first two authors) completed vowel segmentation for the speakers. To calculate inter-rater reliability, 20% of the speakers were segmented again by the other rater. Two-way intraclass coefficients were computed for the extracted F1 and F2 from the temporal midpoint of the vowel segments. Since only one set of ratings will be used in the data analysis, we focus on the single ICC results and interpretation. However, we also report the average ICC values to be comprehensive.
## Creating new data frames to calculate ICC for extracted F1 and F2 values
F1_Rel <- Reliability %>%
dplyr::select(c(F1, F1_rel))
F2_Rel <- Reliability %>%
dplyr::select(c(F2, F2_rel))
## Single ICC for F1
Single_F1 <- irr::icc(F1_Rel, model = "twoway", type = "agreement", unit = "single")
## Average ICC for F1
Average_F1 <- irr::icc(F1_Rel, model = "twoway", type = "agreement", unit = "average")
## Single ICC for F2
Single_F2 <- irr::icc(F2_Rel, model = "twoway", type = "agreement", unit = "single")
## Average ICC for F2
Average_F2 <- irr::icc(F2_Rel, model = "twoway", type = "agreement", unit = "average")
## Inter-rater reliability results and interpretation
print(paste("Single ICC for F1 is ", round(Single_F1$value, digits = 3), ". ",
"The 95% CI is [", round(Single_F1$lbound, digits = 3), " - ", round(Single_F1$ubound, digits = 3), "].", sep = ""))
[1] "Single ICC for F1 is 0.866. The 95% CI is [0.837 - 0.89]."
print(paste("Single ICC for F2 is ", round(Single_F2$value, digits = 3), ". ",
"The 95% CI is [", round(Single_F2$lbound, digits = 3), " - ", round(Single_F2$ubound, digits = 3), "].", sep = ""))
[1] "Single ICC for F2 is 0.931. The 95% CI is [0.916 - 0.944]."
print(paste("Average ICC for F1 is ", round(Average_F1$value, digits = 3), ". ",
"The 95% CI is [", round(Average_F1$lbound, digits = 3), " - ", round(Average_F1$ubound, digits = 3), "].", sep = ""))
[1] "Average ICC for F1 is 0.928. The 95% CI is [0.911 - 0.942]."
print(paste("Average ICC for F2 is ", round(Average_F2$value, digits = 3), ". ",
"The 95% CI is [", round(Average_F2$lbound, digits = 3), " - ", round(Average_F2$ubound, digits = 3), "].", sep = ""))
[1] "Average ICC for F2 is 0.964. The 95% CI is [0.956 - 0.971]."
print("Thus, interrater reliability for the extracted F1 and F2 values from the vowel segments was good to excellent.")
[1] "Thus, interrater reliability for the extracted F1 and F2 values from the vowel segments was good to excellent."
## Removing extra data frames from environment
rm(F1_Rel, F2_Rel, Reliability, Single_F1, Single_F2, Average_F1, Average_F2)
Descriptive Statistics
Correlations
CorrMatrix <- AcousticData %>%
dplyr::select(VSA_b, vowel_ED_b, Hull_b, Hull_bVSD_25, Hull_bVSD_50, Hull_bVSD_75, VAS, transAcc) %>%
as.matrix() %>%
Hmisc::rcorr()
CorrMatrix <- CorrMatrix$r
stats::cor.test(AcousticData$VSA_b, AcousticData$vowel_ED_b, method = "pearson")
Pearson's product-moment correlation
data: AcousticData$VSA_b and AcousticData$vowel_ED_b
t = 6.5285, df = 38, p-value = 1.076e-07
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.5372669 0.8468014
sample estimates:
cor
0.7270881
stats::cor.test(AcousticData$Hull_b, AcousticData$Hull_bVSD_25, method = "pearson")
Pearson's product-moment correlation
data: AcousticData$Hull_b and AcousticData$Hull_bVSD_25
t = 9.4906, df = 38, p-value = 1.43e-11
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.7135136 0.9119080
sample estimates:
cor
0.838625
write.csv(CorrMatrix, file = "Tables/Correlation Matrix.csv")
rm(CorrMatrix)
Research Q1: Modeling Intelligibility
Orthographic Transcriptions
Model 1
# Specifying Model 1
OT_Model1 <- lm(transAcc ~ Hull_bVSD_25, data = AcousticData)
## Model 1 Assumptions
performance::check_model(OT_Model1)

## Model 1 Summary
summary(OT_Model1)
Call:
lm(formula = transAcc ~ Hull_bVSD_25, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-47.896 -14.090 5.996 17.470 36.105
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 48.2973 9.7372 4.960 1.5e-05 ***
Hull_bVSD_25 0.6417 0.5663 1.133 0.264
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 23.83 on 38 degrees of freedom
Multiple R-squared: 0.03268, Adjusted R-squared: 0.007224
F-statistic: 1.284 on 1 and 38 DF, p-value: 0.2643
Model 2
## Specifying Model 2
OT_Model2 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)
## Model 2 Assumption Check
performance::check_model(OT_Model2)

## Model 2 Summary
summary(OT_Model2)
Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-48.854 -13.962 5.567 16.758 36.257
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 47.3374 10.3316 4.582 5.09e-05 ***
Hull_bVSD_25 0.8045 0.7781 1.034 0.308
Hull_bVSD_75 -0.7188 2.3225 -0.309 0.759
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 24.11 on 37 degrees of freedom
Multiple R-squared: 0.03518, Adjusted R-squared: -0.01698
F-statistic: 0.6745 on 2 and 37 DF, p-value: 0.5156
## Model 1 and Model 2 Comparison
anova(OT_Model1, OT_Model2)
Analysis of Variance Table
Model 1: transAcc ~ Hull_bVSD_25
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75
Res.Df RSS Df Sum of Sq F Pr(>F)
1 38 21570
2 37 21514 1 55.696 0.0958 0.7587
Model 3
## Specifying Model 3
OT_Model3 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, data = AcousticData)
## Model 3 Assumption Check
performance::check_model(OT_Model3)

## Model 3 Summary
summary(OT_Model3)
Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b,
data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-56.706 -13.157 7.018 17.957 29.990
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 31.0806 14.4916 2.145 0.0388 *
Hull_bVSD_25 -0.8439 1.2984 -0.650 0.5199
Hull_bVSD_75 0.3159 2.3714 0.133 0.8948
Hull_b 1.2941 0.8247 1.569 0.1253
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 23.65 on 36 degrees of freedom
Multiple R-squared: 0.09695, Adjusted R-squared: 0.0217
F-statistic: 1.288 on 3 and 36 DF, p-value: 0.2932
## Model 2 and Model 3 Comparison
anova(OT_Model2, OT_Model3)
Analysis of Variance Table
Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b
Res.Df RSS Df Sum of Sq F Pr(>F)
1 37 21514
2 36 20137 1 1377.5 2.4626 0.1253
Model 4
## Specifying Model 4
OT_Model4 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b, data = AcousticData)
## Model 4 Assumption Check
performance::check_model(OT_Model4)

## Model 4 Summary
summary(OT_Model4)
Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b +
VSA_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-44.796 -11.144 3.042 12.567 34.297
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 27.4533 13.1156 2.093 0.04365 *
Hull_bVSD_25 -1.2602 1.1782 -1.070 0.29214
Hull_bVSD_75 0.5663 2.1390 0.265 0.79274
Hull_b 0.7364 0.7654 0.962 0.34261
VSA_b 6.0896 1.9954 3.052 0.00432 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 21.32 on 35 degrees of freedom
Multiple R-squared: 0.2868, Adjusted R-squared: 0.2052
F-statistic: 3.518 on 4 and 35 DF, p-value: 0.01626
## Model 3 and Model 4 Comparison
anova(OT_Model3, OT_Model4)
Analysis of Variance Table
Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b
Res.Df RSS Df Sum of Sq F Pr(>F)
1 36 20137
2 35 15904 1 4232.4 9.314 0.004321 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Model 5
## Specifying Model 5
OT_Model5 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b, data = AcousticData)
## Model 4 Assumption Check
performance::check_model(OT_Model5)

## Model 4 Summary
summary(OT_Model5)
Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b +
VSA_b + vowel_ED_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-46.533 -11.028 3.327 13.017 33.227
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 20.3598 21.5072 0.947 0.3505
Hull_bVSD_25 -1.2567 1.1924 -1.054 0.2994
Hull_bVSD_75 0.7007 2.1882 0.320 0.7508
Hull_b 0.6895 0.7826 0.881 0.3845
VSA_b 5.3903 2.6194 2.058 0.0473 *
vowel_ED_b 5.5182 13.1650 0.419 0.6777
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 21.57 on 34 degrees of freedom
Multiple R-squared: 0.2904, Adjusted R-squared: 0.1861
F-statistic: 2.783 on 5 and 34 DF, p-value: 0.03271
## Model 3 and Model 4 Comparison
anova(OT_Model4, OT_Model5)
Analysis of Variance Table
Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b
Res.Df RSS Df Sum of Sq F Pr(>F)
1 35 15904
2 34 15823 1 81.764 0.1757 0.6777
Final Model
## Specifying Final Model
OT_Model_final <- lm(transAcc ~ VSA_b, data = AcousticData)
## Final Model Assumption Check
performance::check_model(OT_Model_final)

## Final Model Summary
summary(OT_Model_final)
Call:
lm(formula = transAcc ~ VSA_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-46.72 -12.69 2.97 14.37 35.39
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 32.508 7.857 4.138 0.000187 ***
VSA_b 5.872 1.613 3.641 0.000807 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 20.86 on 38 degrees of freedom
Multiple R-squared: 0.2586, Adjusted R-squared: 0.2391
F-statistic: 13.25 on 1 and 38 DF, p-value: 0.0008068
confint(OT_Model_final)
2.5 % 97.5 %
(Intercept) 16.602765 48.413532
VSA_b 2.606927 9.137097
VAS Models
Model 1
# Specifying Model 1
VAS_Model1 <- lm(VAS ~ Hull_bVSD_25, data = AcousticData)
## Model 1 Assumptions
performance::check_model(VAS_Model1)

## Model 1 Summary
summary(VAS_Model1)
Call:
lm(formula = VAS ~ Hull_bVSD_25, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-47.625 -16.684 8.462 19.440 37.352
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 42.6328 10.7512 3.965 0.000313 ***
Hull_bVSD_25 0.5877 0.6253 0.940 0.353236
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 26.31 on 38 degrees of freedom
Multiple R-squared: 0.02272, Adjusted R-squared: -0.003001
F-statistic: 0.8833 on 1 and 38 DF, p-value: 0.3532
Model 2
## Specifying Model 2
VAS_Model2 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)
## Model 2 Assumption Check
performance::check_model(VAS_Model2)

## Model 2 Summary
summary(VAS_Model2)
Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-47.850 -16.576 8.382 19.448 37.237
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 42.3384 11.4211 3.707 0.000684 ***
Hull_bVSD_25 0.6376 0.8602 0.741 0.463195
Hull_bVSD_75 -0.2204 2.5674 -0.086 0.932036
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 26.66 on 37 degrees of freedom
Multiple R-squared: 0.02291, Adjusted R-squared: -0.0299
F-statistic: 0.4338 on 2 and 37 DF, p-value: 0.6513
## Model 1 and Model 2 Comparison
anova(VAS_Model1, VAS_Model2)
Analysis of Variance Table
Model 1: VAS ~ Hull_bVSD_25
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75
Res.Df RSS Df Sum of Sq F Pr(>F)
1 38 26296
2 37 26291 1 5.239 0.0074 0.932
Model 3
## Specifying Model 3
VAS_Model3 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, data = AcousticData)
## Model 3 Assumption Check
performance::check_model(VAS_Model3)

## Model 3 Summary
summary(VAS_Model3)
Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-56.444 -18.989 6.121 18.036 32.281
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 25.0400 16.0599 1.559 0.128
Hull_bVSD_25 -1.1164 1.4389 -0.776 0.443
Hull_bVSD_75 0.8805 2.6280 0.335 0.740
Hull_b 1.3770 0.9139 1.507 0.141
Residual standard error: 26.21 on 36 degrees of freedom
Multiple R-squared: 0.08087, Adjusted R-squared: 0.00428
F-statistic: 1.056 on 3 and 36 DF, p-value: 0.3799
## Model 2 and Model 3 Comparison
anova(VAS_Model2, VAS_Model3)
Analysis of Variance Table
Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b
Res.Df RSS Df Sum of Sq F Pr(>F)
1 37 26291
2 36 24731 1 1559.6 2.2702 0.1406
Model 4
## Specifying Model 4
VAS_Model4 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b, data = AcousticData)
## Model 4 Assumption Check
performance::check_model(VAS_Model4)

## Model 4 Summary
summary(VAS_Model4)
Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b,
data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-42.25 -14.17 5.76 16.26 41.48
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 21.0802 14.5922 1.445 0.15746
Hull_bVSD_25 -1.5708 1.3109 -1.198 0.23885
Hull_bVSD_75 1.1539 2.3798 0.485 0.63078
Hull_b 0.7682 0.8516 0.902 0.37320
VSA_b 6.6479 2.2200 2.995 0.00502 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 23.72 on 35 degrees of freedom
Multiple R-squared: 0.2683, Adjusted R-squared: 0.1847
F-statistic: 3.209 on 4 and 35 DF, p-value: 0.02405
## Model 3 and Model 4 Comparison
anova(VAS_Model3, VAS_Model4)
Analysis of Variance Table
Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b
Res.Df RSS Df Sum of Sq F Pr(>F)
1 36 24731
2 35 19687 1 5043.9 8.9671 0.00502 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Model 5
## Specifying Model 5
VAS_Model5 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b, data = AcousticData)
## Model 5 Assumption Check
performance::check_model(VAS_Model5)

## Model 5 Summary
summary(VAS_Model5)
Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b +
vowel_ED_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-44.569 -13.697 5.187 16.183 40.204
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 12.6419 23.9197 0.529 0.6006
Hull_bVSD_25 -1.5667 1.3261 -1.181 0.2456
Hull_bVSD_75 1.3137 2.4337 0.540 0.5928
Hull_b 0.7124 0.8704 0.818 0.4188
VSA_b 5.8159 2.9132 1.996 0.0539 .
vowel_ED_b 6.5644 14.6417 0.448 0.6568
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 23.99 on 34 degrees of freedom
Multiple R-squared: 0.2726, Adjusted R-squared: 0.1657
F-statistic: 2.549 on 5 and 34 DF, p-value: 0.0461
## Model 4 and Model 5 Comparison
anova(VAS_Model4, VAS_Model5)
Analysis of Variance Table
Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b
Res.Df RSS Df Sum of Sq F Pr(>F)
1 35 19687
2 34 19572 1 115.7 0.201 0.6568
Final Model
## Specifying Final Model
VAS_Model_final <- lm(VAS ~ VSA_b, data = AcousticData)
## Final Model Assumption Check
performance::check_model(VAS_Model_final)

## Final Model Summary
summary(VAS_Model_final)
Call:
lm(formula = VAS ~ VSA_b, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-44.956 -15.943 6.754 17.153 43.062
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 24.703 8.761 2.820 0.00760 **
VSA_b 6.163 1.798 3.427 0.00148 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 23.26 on 38 degrees of freedom
Multiple R-squared: 0.2361, Adjusted R-squared: 0.216
F-statistic: 11.74 on 1 and 38 DF, p-value: 0.001482
confint(VAS_Model_final)
2.5 % 97.5 %
(Intercept) 6.966936 42.438084
VSA_b 2.521887 9.803467
Research Q2: Relationship between OT and VAS
Model 1
# Specify Model
OT_VAS_model <- lm(transAcc ~ VAS*Etiology + VAS*Sex, data = AcousticData)
# Assumption Check
performance::check_model(OT_VAS_model)

# Model Results
summary(OT_VAS_model)
Call:
lm(formula = transAcc ~ VAS * Etiology + VAS * Sex, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-14.910 -4.525 -1.280 5.529 16.932
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 10.8993562 5.7092981 1.909 0.0659 .
VAS 0.8924319 0.1276625 6.991 9.1e-08 ***
EtiologyAtaxic 2.9854239 9.5149402 0.314 0.7559
EtiologyHD 2.1009983 7.3948950 0.284 0.7783
EtiologyPD -2.4903757 10.1590855 -0.245 0.8080
SexM 6.8939642 7.0796700 0.974 0.3380
VAS:EtiologyAtaxic -0.0019088 0.1791048 -0.011 0.9916
VAS:EtiologyHD 0.0007804 0.1453318 0.005 0.9958
VAS:EtiologyPD 0.0320470 0.1732105 0.185 0.8545
VAS:SexM -0.1220661 0.1241230 -0.983 0.3333
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 8.488 on 30 degrees of freedom
Multiple R-squared: 0.9031, Adjusted R-squared: 0.874
F-statistic: 31.06 on 9 and 30 DF, p-value: 8.181e-13
Final Linear Model
# Specify Final Model
OT_VAS_final <- lm(transAcc ~ VAS, data = AcousticData)
confint(OT_VAS_final)
2.5 % 97.5 %
(Intercept) 8.1038688 19.3870846
VAS 0.7637645 0.9580856
# Model Results
summary(OT_VAS_final)
Call:
lm(formula = transAcc ~ VAS, data = AcousticData)
Residuals:
Min 1Q Median 3Q Max
-13.6882 -4.9316 -0.4408 4.9974 17.2110
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 13.74548 2.78681 4.932 1.64e-05 ***
VAS 0.86093 0.04799 17.938 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 7.873 on 38 degrees of freedom
Multiple R-squared: 0.8944, Adjusted R-squared: 0.8916
F-statistic: 321.8 on 1 and 38 DF, p-value: < 2.2e-16
Quadratic Linear Model
# Specify Final Model
OT_VAS_final_quadratic <- lm(transAcc ~ VAS, data = AcousticData %>%
dplyr::mutate(VAS = VAS^2))
#confint(OT_VAS_final_quadratic)
# Model Results
summary(OT_VAS_final_quadratic)
Call:
lm(formula = transAcc ~ VAS, data = AcousticData %>% dplyr::mutate(VAS = VAS^2))
Residuals:
Min 1Q Median 3Q Max
-18.729 -7.579 1.411 6.587 22.341
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 28.274672 2.894431 9.769 6.52e-12 ***
VAS 0.008956 0.000702 12.759 2.61e-15 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 10.54 on 38 degrees of freedom
Multiple R-squared: 0.8107, Adjusted R-squared: 0.8058
F-statistic: 162.8 on 1 and 38 DF, p-value: 2.608e-15
Manuscript Tables
##Descriptives Table
gtData <- AcousticData %>%
rbind(.,AcousticData %>%
dplyr::mutate(Etiology = "All Etiologies")) %>%
rbind(.,AcousticData %>%
rbind(.,AcousticData %>%
dplyr::mutate(Etiology = "All Etiologies")) %>%
dplyr::mutate(Sex = "All")) %>%
dplyr::mutate(Sex = as.factor(Sex),
Etiology = as.factor(Etiology)) %>%
dplyr::group_by(Sex, Etiology) %>%
dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T)) %>%
pivot_longer(cols = VSA_mean:OT_sd, names_to = "Measure",
values_to = "Value") %>%
dplyr::mutate(meanSD = ifelse(grepl("_mean",Measure),"M","sd"),
Measure = gsub("_mean","",Measure),
Measure = gsub("_sd","",Measure),
Etiology = paste(Etiology,meanSD, sep = "_"),
Sex = case_when(
Sex == "All" ~ "All Speakers",
Sex == "M" ~ "Male",
Sex == "F" ~ "Female"
)) %>%
dplyr::select(!meanSD) %>%
pivot_wider(names_from = Etiology, values_from = "Value") %>%
dplyr::filter(Measure != "VSD50")
`summarise()` has grouped output by 'Sex'. You can override using the `.groups` argument.
gtData %>%
gt::gt(
rowname_col = "Measure",
groupname_col = "Sex",
) %>%
fmt_number(
columns = 'All Etiologies_M':PD_sd,
decimals = 2
) %>%
tab_spanner(
label = "All Etiologies",
columns = c('All Etiologies_M', 'All Etiologies_sd')
) %>%
tab_spanner(
label = "ALS",
columns = c(ALS_M, ALS_sd)
) %>%
tab_spanner(
label = "PD",
columns = c(PD_M, PD_sd)
) %>%
tab_spanner(
label = "HD",
columns = c(HD_M, HD_sd)
) %>%
tab_spanner(
label = "Ataxic",
columns = c(Ataxic_M, Ataxic_sd)
) %>%
cols_label(
'All Etiologies_M' = "M",
'All Etiologies_sd' = "SD",
ALS_M = "M",
ALS_sd = "SD",
PD_M = "M",
PD_sd = "SD",
HD_M = "M",
HD_sd = "SD",
Ataxic_M = "M",
Ataxic_sd = "SD"
) %>%
gtsave("DescriptivesTable.html", path = "Tables")
OT Model
sjPlot::tab_model(OT_Model1,OT_Model2,OT_Model3, OT_Model4, OT_Model5, OT_Model_final,
show.ci = F,
p.style = "stars",
file = "Tables/OT Models.html")
VAS Model
sjPlot::tab_model(VAS_Model1,VAS_Model2,VAS_Model3, VAS_Model4, VAS_Model5, VAS_Model_final,
show.ci = F,
p.style = "stars",
file = "Tables/VAS Models.html")
OT vs. VAS
sjPlot::tab_model(OT_VAS_model,OT_VAS_final,
show.ci = F,
show.reflvl = TRUE,
p.style = "stars",
file = "Tables/OT and VAS Comparison.html")
Manuscript Figures
Example Measures

Filtering Process
OT vs. VAS
plotData_Int <- AcousticData %>%
dplyr::filter(!grepl("_rel", Speaker)) %>%
dplyr::group_by(Speaker) %>%
dplyr::mutate(segMin = base::min(VAS, transAcc),
segMax = base::max(VAS, transAcc),
ratingAvg = mean(VAS, transAcc, na.rm = T),
Speaker = as.factor(Speaker),
Etiology = as.factor(Etiology)) %>%
arrange(segMax)
my_pal <- c("#f26430", "#272D2D","#256eff")
# With a bit more style
plot_Int <- ggplot(plotData_Int) +
geom_segment(aes(x = fct_inorder(Speaker),
xend = Speaker,
y = segMin,
yend = segMax,
color = Etiology)) +
geom_point(aes(x = Speaker,
y = VAS,
color = Etiology),
#color = my_pal[1],
size = 3,
shape = 19) +
geom_point(aes(x = Speaker,
y = transAcc,
color = Etiology),
#color = my_pal[2],
size = 3,
shape = 15) +
coord_flip()+
theme_classic() +
theme(
legend.position = "none",
panel.border = element_blank(),
) +
xlab("") +
ylab("Speech Intelligibility") +
ggtitle("Speech Intelligibility") +
ylim(c(0,100))
plot_Int
myPal <- c("#1AAD77", "#1279B5", "#FFBF00", "#FD7853", "#BF3178")
myShapes <- c(16, 18, 17, 15)
scatter1 <- ggplot(plotData_Int,
aes(x = VAS,
y = transAcc,
color = Etiology,
shape = Etiology,
linetype = Etiology)) +
geom_point() +
#geom_smooth(method = "lm", se = F) +
geom_abline(intercept = 0, slope = 1) +
coord_cartesian(xlim = c(0,100), ylim = c(0,100)) +
labs(x = "Intelligibility (VAS)", y = "Intelligibility (OT)") +
scale_color_manual(values = myPal) +
scale_shape_manual(values = myShapes) +
theme_classic() +
theme(aspect.ratio=1,
legend.position="right")
scatter2 <- ggplot(plotData_Int,
aes(x = VAS,
y = transAcc,
color = Etiology,
shape = Etiology,
linetype = Etiology)) +
#geom_point() +
geom_smooth(method = "lm", se = F) +
geom_abline(intercept = 0, slope = 1) +
coord_cartesian(xlim = c(0,100), ylim = c(0,100)) +
labs(x = "Intelligibility (VAS)", y = "Intelligibility (OT)") +
scale_color_manual(values = myPal) +
scale_shape_manual(values = myShapes) +
theme_classic() +
theme(aspect.ratio=1,
legend.position="right")
combinedScatter <- ggarrange(scatter1,
scatter2,
common.legend = F,
ncol = 2,
nrow = 1)
combinedScatter
ggsave(filename = "Plots/OT and VAS Scatterplot.png",
plot = combinedScatter,
height = 2,
width = 6,
units = "in",
scale = 1)
rm(scatter1, scatter2, combinedScatter)
Model Scatterplot
modelFigureData <- AcousticData %>%
dplyr::filter(!grepl("_rel",Speaker)) %>%
dplyr::select(Speaker, Etiology, Sex, VSA_b, vowel_ED_b, Hull_b, Hull_bVSD_25, Hull_bVSD_75, VAS, transAcc) %>%
dplyr::mutate(Speaker = as.factor(Speaker),
Etiology = as.factor(Etiology),
Sex = as.factor(Sex)) %>%
tidyr::pivot_longer(cols = VAS:transAcc, names_to = "IntType", values_to = "Int") %>%
dplyr::mutate(IntType = case_when(
IntType == "transAcc" ~ "OT",
TRUE ~ "VAS"
),
IntType = as.factor(IntType))
ylabel <- "Intelligibility"
myPal <- c("#2D2D37", "#1279B5")
myPalShape <- c(19, 1)
VSA <- modelFigureData %>%
ggplot() +
aes(x = VSA_b,
y = Int,
color = IntType,
shape = IntType,
linetype = IntType) +
geom_point() +
geom_smooth(method = "lm", se = T, fill = "light grey") +
xlab(expression("VSA (Bark"^2*")")) +
ylab(ylabel) +
coord_cartesian(ylim = c(0,100)) +
theme_classic() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"),
aspect.ratio=1) +
scale_color_manual(values = myPal) +
scale_shape_manual(values = myPalShape) +
labs(color="Intelligibility Type",
shape = "Intelligibility Type",
linetype = "Intelligibility Type")
disp <- modelFigureData %>%
ggplot() +
aes(x = vowel_ED_b,
y = Int,
color = IntType,
shape = IntType,
linetype = IntType) +
geom_point() +
geom_smooth(method = "lm", se = T, fill = "light grey") +
xlab("Corner Dispersion (Bark)") +
ylab(ylabel) +
coord_cartesian(ylim = c(0,100)) +
theme_classic() +
theme(aspect.ratio=1) +
scale_color_manual(values = myPal) +
scale_shape_manual(values = myPalShape) +
labs(color="Intelligibility Type",
shape = "Intelligibility Type",
linetype = "Intelligibility Type")
Hull <- modelFigureData %>%
ggplot() +
aes(x = Hull_b,
y = Int,
color = IntType,
shape = IntType,
linetype = IntType) +
geom_point() +
geom_smooth(method = "lm", se = T, fill = "light grey") +
xlab(expression("VSA"[Hull]*" (Bark"^2*")")) +
ylab(ylabel) +
coord_cartesian(ylim = c(0,100)) +
theme_classic() +
theme(aspect.ratio=1) + theme(legend.position = "none") +
scale_color_manual(values = myPal) +
scale_shape_manual(values = myPalShape) +
labs(color="Intelligibility Type",
shape = "Intelligibility Type",
linetype = "Intelligibility Type")
vsd25 <- modelFigureData %>%
ggplot() +
aes(x = Hull_bVSD_25,
y = Int,
color = IntType,
shape = IntType,
linetype = IntType) +
geom_point() +
geom_smooth(method = "lm", se = T, fill = "light grey") +
xlab(expression("VSD"[25]*" (Bark"^2*")")) +
ylab(ylabel) +
coord_cartesian(ylim = c(0,100)) +
theme_classic() +
theme(aspect.ratio=1) + theme(legend.position = "none") +
scale_color_manual(values = myPal) +
scale_shape_manual(values = myPalShape) +
labs(color="Intelligibility Type",
shape = "Intelligibility Type",
linetype = "Intelligibility Type")
vsd75 <- modelFigureData %>%
ggplot() +
aes(x = Hull_bVSD_75,
y = Int,
color = IntType,
shape = IntType,
linetype = IntType) +
geom_point() +
geom_smooth(method = "lm", se = T, fill = "light grey") +
xlab(expression("VSD"[75]*" (Bark"^2*")")) +
ylab(ylabel) +
coord_cartesian(ylim = c(0,100)) +
theme_classic() +
theme(aspect.ratio=1) + theme(legend.position = "none") +
scale_color_manual(values = myPal) +
scale_shape_manual(values = myPalShape) +
labs(color="Intelligibility Type",
shape = "Intelligibility Type",
linetype = "Intelligibility Type")
# Creating OT Scatterplot Figure
scatter <- VSA + disp + patchwork::guide_area() + Hull + vsd25 + vsd75 +
patchwork::plot_layout(guides = 'collect',
ncol = 3)
scatter
ggsave("Plots/ModelFigure.png", scatter,
height = 4,
width = 6,
units = "in",
scale = 1.1)
Speaker Demographics
SpeakerDemo <- AcousticData %>%
dplyr::select(c(Speaker, Sex, Etiology))
Ages <- rio::import("Prepped Data/Speaker Ages.xlsx")
SpeakerDemo <- full_join(SpeakerDemo, Ages, by = "Speaker")
SpeakerDemoInfo <- SpeakerDemo %>%
furniture::table1(Sex, Etiology, Age, na.rm = F)
SpeakerDemoInfo
SpeakerDemo %>%
dplyr::summarize(mean_age = mean(Age, na.rm = T), age_sd = sd(Age, na.rm = T), age_range = range(Age, na.rm = T))
LS0tCnRpdGxlOiAiVm93ZWwgQWNvdXN0aWNzIGFzIFByZWRpY3RvcnMgb2YgU3BlZWNoIEludGVsbGlnaWJpbGl0eSBpbiBEeXNhcnRocmlhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIGlzIHRoZSBjb2RlIGZvciB0aGUgc3RhdGlzdGljYWwgYW5hbHlzaXMgZm9yICJWb3dlbCBBY291c3RpY3MgYXMgUHJlZGljdG9ycyBvZiBTcGVlY2ggSW50ZWxsaWdpYmlsaXR5IGluIER5c2FydGhyaWEuIgoKIyBMb2FkaW5nIFBhY2thZ2VzCgpgYGB7cn0KCmxpYnJhcnkocmlvKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShpcnIpICMgaW5zdGFsbC5wYWNrYWdlcygnaXJyJykKbGlicmFyeShwZXJmb3JtYW5jZSkKbGlicmFyeShjYXIpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KCJIbWlzYyIpICMgaW5zdGFsbC5wYWNrYWdlcygnSG1pc2MnKQpsaWJyYXJ5KGdncmlkZ2VzKQpsaWJyYXJ5KGZ1cm5pdHVyZSkgIyBpbnN0YWxsLnBhY2thZ2VzKCdmdXJuaXR1cmUnKQpsaWJyYXJ5KGd0KQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeShrcykKbGlicmFyeShlbXVSKSAjIGluc3RhbGwucGFja2FnZXMoJ2VtdVInKQpsaWJyYXJ5KGdlb210ZXh0cGF0aCkgIyByZW1vdGVzOjppbnN0YWxsX2dpdGh1YigiQWxsYW5DYW1lcm9uL2dlb210ZXh0cGF0aCIpCgpgYGAKCiMgVXBsb2FkIERhdGFzZXRzCgpgYGB7cn0KClJlbGlhYmlsaXR5IDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvUmVsaWFiaWxpdHkgRGF0YS5jc3YiKQpBY291c3RpY0RhdGEgPC0gcmlvOjppbXBvcnQoIlByZXBwZWQgRGF0YS9BY291c3RpY01lYXN1cmVzLmNzdiIpICU+JQogIGRwbHlyOjptdXRhdGUoaW50RGlmZiA9IFZBUyAtIHRyYW5zQWNjKQoKQWNvdXN0aWNEYXRhIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFncmVwbCgiX3JlbCIsIFNwZWFrZXIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoU3BlYWtlciwgU2V4LCBFdGlvbG9neSwgdm93ZWxfRURfYiwgVlNBX2IsIEh1bGxfYiwgSHVsbF9iVlNEXzI1LCBIdWxsX2JWU0RfNTAsIEh1bGxfYlZTRF83NSwgVkFTLCB0cmFuc0FjYykpICU+JQogIGRwbHlyOjptdXRhdGUoRXRpb2xvZ3kgPSBhcy5mYWN0b3IoRXRpb2xvZ3kpLAogICAgICAgICAgICAgICAgU2V4ID0gYXMuZmFjdG9yKFNleCksCiAgICAgICAgICAgICAgICBTcGVha2VyID0gYXMuZmFjdG9yKFNwZWFrZXIpKQoKTGlzdGVuZXJzIDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvTGlzdGVuZXJfRGVtb2dyYXBoaWNzLmNzdiIpICU+JQogIGRwbHlyOjpzZWxlY3QoIWMoU3RhcnREYXRlOnByb2xvZmljSUQsIFEyLjRfNl9URVhULCBRMy4yXzhfVEVYVCwgQXVkaW9DaGVjazpFUDMpKQoKTGlzdGVuZXJzJHJhY2VbTGlzdGVuZXJzJFEzLjNfN19URVhUID09ICJOYXRpdmUgQW1lcmljYW4vIEFmcmljYW4gYW1lcmNpbmciXSA8LSAiQmlyYWNpYWwgb3IgTXVsdGlyYWNpYWwiCmBgYAoKCiMgSW50ZXItcmF0ZXIgUmVsaWFiaWxpdHkKClR3byByYXRlcnMgKHRoZSBmaXJzdCB0d28gYXV0aG9ycykgY29tcGxldGVkIHZvd2VsIHNlZ21lbnRhdGlvbiBmb3IgdGhlIHNwZWFrZXJzLiBUbyBjYWxjdWxhdGUgaW50ZXItcmF0ZXIgcmVsaWFiaWxpdHksIDIwJSBvZiB0aGUgc3BlYWtlcnMgd2VyZSBzZWdtZW50ZWQgYWdhaW4gYnkgdGhlIG90aGVyIHJhdGVyLiBUd28td2F5IGludHJhY2xhc3MgY29lZmZpY2llbnRzIHdlcmUgY29tcHV0ZWQgZm9yIHRoZSBleHRyYWN0ZWQgRjEgYW5kIEYyIGZyb20gdGhlIHRlbXBvcmFsIG1pZHBvaW50IG9mIHRoZSB2b3dlbCBzZWdtZW50cy4gU2luY2Ugb25seSBvbmUgc2V0IG9mIHJhdGluZ3Mgd2lsbCBiZSB1c2VkIGluIHRoZSBkYXRhIGFuYWx5c2lzLCB3ZSBmb2N1cyBvbiB0aGUgc2luZ2xlIElDQyByZXN1bHRzIGFuZCBpbnRlcnByZXRhdGlvbi4gSG93ZXZlciwgd2UgYWxzbyByZXBvcnQgdGhlIGF2ZXJhZ2UgSUNDIHZhbHVlcyB0byBiZSBjb21wcmVoZW5zaXZlLgoKYGBge3J9CgojIyBDcmVhdGluZyBuZXcgZGF0YSBmcmFtZXMgdG8gY2FsY3VsYXRlIElDQyBmb3IgZXh0cmFjdGVkIEYxIGFuZCBGMiB2YWx1ZXMKCkYxX1JlbCA8LSBSZWxpYWJpbGl0eSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoRjEsIEYxX3JlbCkpCgpGMl9SZWwgPC0gUmVsaWFiaWxpdHkgJT4lCiAgZHBseXI6OnNlbGVjdChjKEYyLCBGMl9yZWwpKQogIAojIyBTaW5nbGUgSUNDIGZvciBGMQpTaW5nbGVfRjEgPC0gaXJyOjppY2MoRjFfUmVsLCBtb2RlbCA9ICJ0d293YXkiLCB0eXBlID0gImFncmVlbWVudCIsIHVuaXQgPSAic2luZ2xlIikKCiMjIEF2ZXJhZ2UgSUNDIGZvciBGMQpBdmVyYWdlX0YxIDwtIGlycjo6aWNjKEYxX1JlbCwgbW9kZWwgPSAidHdvd2F5IiwgdHlwZSA9ICJhZ3JlZW1lbnQiLCB1bml0ID0gImF2ZXJhZ2UiKQoKIyMgU2luZ2xlIElDQyBmb3IgRjIKU2luZ2xlX0YyIDwtIGlycjo6aWNjKEYyX1JlbCwgbW9kZWwgPSAidHdvd2F5IiwgdHlwZSA9ICJhZ3JlZW1lbnQiLCB1bml0ID0gInNpbmdsZSIpCgojIyBBdmVyYWdlIElDQyBmb3IgRjIKQXZlcmFnZV9GMiA8LSBpcnI6OmljYyhGMl9SZWwsIG1vZGVsID0gInR3b3dheSIsIHR5cGUgPSAiYWdyZWVtZW50IiwgdW5pdCA9ICJhdmVyYWdlIikKCiMjIEludGVyLXJhdGVyIHJlbGlhYmlsaXR5IHJlc3VsdHMgYW5kIGludGVycHJldGF0aW9uCgpwcmludChwYXN0ZSgiU2luZ2xlIElDQyBmb3IgRjEgaXMgIiwgcm91bmQoU2luZ2xlX0YxJHZhbHVlLCBkaWdpdHMgPSAzKSwgIi4gIiwgCiAgICAgICAgICAgICJUaGUgOTUlIENJIGlzIFsiLCByb3VuZChTaW5nbGVfRjEkbGJvdW5kLCBkaWdpdHMgPSAzKSwgIiAtICIsIHJvdW5kKFNpbmdsZV9GMSR1Ym91bmQsIGRpZ2l0cyA9IDMpLCAiXS4iLCBzZXAgPSAiIikpCgpwcmludChwYXN0ZSgiU2luZ2xlIElDQyBmb3IgRjIgaXMgIiwgcm91bmQoU2luZ2xlX0YyJHZhbHVlLCBkaWdpdHMgPSAzKSwgIi4gIiwgCiAgICAgICAgICAgICJUaGUgOTUlIENJIGlzIFsiLCByb3VuZChTaW5nbGVfRjIkbGJvdW5kLCBkaWdpdHMgPSAzKSwgIiAtICIsIHJvdW5kKFNpbmdsZV9GMiR1Ym91bmQsIGRpZ2l0cyA9IDMpLCAiXS4iLCBzZXAgPSAiIikpCgpwcmludChwYXN0ZSgiQXZlcmFnZSBJQ0MgZm9yIEYxIGlzICIsIHJvdW5kKEF2ZXJhZ2VfRjEkdmFsdWUsIGRpZ2l0cyA9IDMpLCAiLiAiLCAKICAgICAgICAgICAgIlRoZSA5NSUgQ0kgaXMgWyIsIHJvdW5kKEF2ZXJhZ2VfRjEkbGJvdW5kLCBkaWdpdHMgPSAzKSwgIiAtICIsIHJvdW5kKEF2ZXJhZ2VfRjEkdWJvdW5kLCBkaWdpdHMgPSAzKSwgIl0uIiwgc2VwID0gIiIpKQoKcHJpbnQocGFzdGUoIkF2ZXJhZ2UgSUNDIGZvciBGMiBpcyAiLCByb3VuZChBdmVyYWdlX0YyJHZhbHVlLCBkaWdpdHMgPSAzKSwgIi4gIiwgCiAgICAgICAgICAgICJUaGUgOTUlIENJIGlzIFsiLCByb3VuZChBdmVyYWdlX0YyJGxib3VuZCwgZGlnaXRzID0gMyksICIgLSAiLCByb3VuZChBdmVyYWdlX0YyJHVib3VuZCwgZGlnaXRzID0gMyksICJdLiIsIHNlcCA9ICIiKSkKCnByaW50KCJUaHVzLCBpbnRlcnJhdGVyIHJlbGlhYmlsaXR5IGZvciB0aGUgZXh0cmFjdGVkIEYxIGFuZCBGMiB2YWx1ZXMgZnJvbSB0aGUgdm93ZWwgc2VnbWVudHMgd2FzIGdvb2QgdG8gZXhjZWxsZW50LiIpCgojIyBSZW1vdmluZyBleHRyYSBkYXRhIGZyYW1lcyBmcm9tIGVudmlyb25tZW50CgpybShGMV9SZWwsIEYyX1JlbCwgUmVsaWFiaWxpdHksIFNpbmdsZV9GMSwgU2luZ2xlX0YyLCBBdmVyYWdlX0YxLCBBdmVyYWdlX0YyKQoKYGBgCgoKIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzCgojIyBDb3JyZWxhdGlvbnMKCmBgYHtyfQpDb3JyTWF0cml4IDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KFZTQV9iLCB2b3dlbF9FRF9iLCBIdWxsX2IsIEh1bGxfYlZTRF8yNSwgSHVsbF9iVlNEXzUwLCBIdWxsX2JWU0RfNzUsIFZBUywgdHJhbnNBY2MpICU+JQogIGFzLm1hdHJpeCgpICU+JQogIEhtaXNjOjpyY29ycigpCgpDb3JyTWF0cml4IDwtIENvcnJNYXRyaXgkcgoKc3RhdHM6OmNvci50ZXN0KEFjb3VzdGljRGF0YSRWU0FfYiwgQWNvdXN0aWNEYXRhJHZvd2VsX0VEX2IsIG1ldGhvZCA9ICJwZWFyc29uIikKc3RhdHM6OmNvci50ZXN0KEFjb3VzdGljRGF0YSRIdWxsX2IsIEFjb3VzdGljRGF0YSRIdWxsX2JWU0RfMjUsIG1ldGhvZCA9ICJwZWFyc29uIikKCndyaXRlLmNzdihDb3JyTWF0cml4LCBmaWxlID0gIlRhYmxlcy9Db3JyZWxhdGlvbiBNYXRyaXguY3N2IikKcm0oQ29yck1hdHJpeCkKCmBgYAoKIyBSZXNlYXJjaCBRMTogTW9kZWxpbmcgSW50ZWxsaWdpYmlsaXR5CgojIyBPcnRob2dyYXBoaWMgVHJhbnNjcmlwdGlvbnMKTW9kZWwgMQpgYGB7cn0KCiMgU3BlY2lmeWluZyBNb2RlbCAxCgpPVF9Nb2RlbDEgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxIEFzc3VtcHRpb25zIAoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsMSkKCiMjIE1vZGVsIDEgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDEpCgpgYGAKCk1vZGVsIDIKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDIKCk9UX01vZGVsMiA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDIgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsMikKCiMjIE1vZGVsIDIgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDIpCgojIyBNb2RlbCAxIGFuZCBNb2RlbCAyIENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsMSwgT1RfTW9kZWwyKQoKYGBgCgpNb2RlbCAzCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAzCgpPVF9Nb2RlbDMgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAzIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9Nb2RlbDMpCgojIyBNb2RlbCAzIFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWwzKQoKIyMgTW9kZWwgMiBhbmQgTW9kZWwgMyBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDIsIE9UX01vZGVsMykKCmBgYAoKTW9kZWwgNApgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNAoKT1RfTW9kZWw0IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA0IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9Nb2RlbDQpCgojIyBNb2RlbCA0IFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWw0KQoKIyMgTW9kZWwgMyBhbmQgTW9kZWwgNCBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDMsIE9UX01vZGVsNCkKCmBgYApNb2RlbCA1CmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA1CgpPVF9Nb2RlbDUgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA0IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9Nb2RlbDUpCgojIyBNb2RlbCA0IFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWw1KQoKIyMgTW9kZWwgMyBhbmQgTW9kZWwgNCBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDQsIE9UX01vZGVsNSkKCmBgYAoKCiMjIyBGaW5hbCBNb2RlbAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIEZpbmFsIE1vZGVsCgpPVF9Nb2RlbF9maW5hbCA8LSBsbSh0cmFuc0FjYyB+IFZTQV9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgRmluYWwgTW9kZWwgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsX2ZpbmFsKQoKIyMgRmluYWwgTW9kZWwgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbF9maW5hbCkKY29uZmludChPVF9Nb2RlbF9maW5hbCkKCmBgYAoKIyMgVkFTIE1vZGVscwoKTW9kZWwgMQpgYGB7cn0KCiMgU3BlY2lmeWluZyBNb2RlbCAxCgpWQVNfTW9kZWwxIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDEgQXNzdW1wdGlvbnMgCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsMSkKCiMjIE1vZGVsIDEgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWwxKQoKYGBgCgpNb2RlbCAyCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAyCgpWQVNfTW9kZWwyIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDIgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDIpCgojIyBNb2RlbCAyIFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsMikKCiMjIE1vZGVsIDEgYW5kIE1vZGVsIDIgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsMSwgVkFTX01vZGVsMikKCmBgYAoKTW9kZWwgMwpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMwoKVkFTX01vZGVsMyA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAzIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWwzKQoKIyMgTW9kZWwgMyBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDMpCgojIyBNb2RlbCAyIGFuZCBNb2RlbCAzIENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDIsIFZBU19Nb2RlbDMpCgpgYGAKCk1vZGVsIDQKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDQKClZBU19Nb2RlbDQgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA0IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw0KQoKIyMgTW9kZWwgNCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDQpCgojIyBNb2RlbCAzIGFuZCBNb2RlbCA0IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDMsIFZBU19Nb2RlbDQpCgpgYGAKCk1vZGVsIDUKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDUKClZBU19Nb2RlbDUgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgNSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsNSkKCiMjIE1vZGVsIDUgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWw1KQoKIyMgTW9kZWwgNCBhbmQgTW9kZWwgNSBDb21wYXJpc29uCgphbm92YShWQVNfTW9kZWw0LCBWQVNfTW9kZWw1KQoKYGBgCgoKIyMjIEZpbmFsIE1vZGVsCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgRmluYWwgTW9kZWwKClZBU19Nb2RlbF9maW5hbCA8LSBsbShWQVMgfiBWU0FfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIEZpbmFsIE1vZGVsIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWxfZmluYWwpCgojIyBGaW5hbCBNb2RlbCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbF9maW5hbCkKY29uZmludChWQVNfTW9kZWxfZmluYWwpCgpgYGAKCiMgUmVzZWFyY2ggUTI6IFJlbGF0aW9uc2hpcCBiZXR3ZWVuIE9UIGFuZCBWQVMKCk1vZGVsIDEKYGBge3J9CgojIFNwZWNpZnkgTW9kZWwKCk9UX1ZBU19tb2RlbCA8LSBsbSh0cmFuc0FjYyB+IFZBUypFdGlvbG9neSArIFZBUypTZXgsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9WQVNfbW9kZWwpCgojIE1vZGVsIFJlc3VsdHMKCnN1bW1hcnkoT1RfVkFTX21vZGVsKQoKYGBgCgojIyBGaW5hbCBMaW5lYXIgTW9kZWwKCmBgYHtyfQoKIyBTcGVjaWZ5IEZpbmFsIE1vZGVsCgpPVF9WQVNfZmluYWwgPC0gbG0odHJhbnNBY2MgfiBWQVMsIGRhdGEgPSBBY291c3RpY0RhdGEpCgpjb25maW50KE9UX1ZBU19maW5hbCkKCiMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShPVF9WQVNfZmluYWwpCgpgYGAKIyMgUXVhZHJhdGljIExpbmVhciBNb2RlbAoKYGBge3J9CgojIFNwZWNpZnkgRmluYWwgTW9kZWwKCk9UX1ZBU19maW5hbF9xdWFkcmF0aWMgPC0gbG0odHJhbnNBY2MgfiBWQVMsIGRhdGEgPSBBY291c3RpY0RhdGEgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6bXV0YXRlKFZBUyA9IFZBU14yKSkKCiNjb25maW50KE9UX1ZBU19maW5hbF9xdWFkcmF0aWMpCgojIE1vZGVsIFJlc3VsdHMKCnN1bW1hcnkoT1RfVkFTX2ZpbmFsX3F1YWRyYXRpYykKCmBgYAojIE1hbnVzY3JpcHQgVGFibGVzCiMjRGVzY3JpcHRpdmVzIFRhYmxlCmBgYHtyfQpndERhdGEgPC0gQWNvdXN0aWNEYXRhICU+JQogIHJiaW5kKC4sQWNvdXN0aWNEYXRhICU+JQogICAgICAgICAgZHBseXI6Om11dGF0ZShFdGlvbG9neSA9ICJBbGwgRXRpb2xvZ2llcyIpKSAlPiUKICByYmluZCguLEFjb3VzdGljRGF0YSAlPiUKICAgICAgICAgIHJiaW5kKC4sQWNvdXN0aWNEYXRhICU+JQogICAgICAgICAgZHBseXI6Om11dGF0ZShFdGlvbG9neSA9ICJBbGwgRXRpb2xvZ2llcyIpKSAlPiUKICAgICAgICAgIGRwbHlyOjptdXRhdGUoU2V4ID0gIkFsbCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFNleCA9IGFzLmZhY3RvcihTZXgpLAogICAgICAgICAgICAgICAgRXRpb2xvZ3kgPSBhcy5mYWN0b3IoRXRpb2xvZ3kpKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoU2V4LCBFdGlvbG9neSkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShWU0FfbWVhbiA9IG1lYW4oVlNBX2IsIG5hLnJtID1UKSwgVlNBX3NkID0gc2QoVlNBX2IsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICBEaXNwX21lYW4gPSBtZWFuKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwgRGlzcF9zZCA9IHNkKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIEh1bGxfbWVhbiA9IG1lYW4oSHVsbF9iLCBuYS5ybSA9VCksIEh1bGxfc2QgPSBzZChIdWxsX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDI1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLCBWU0QyNV9zZCA9IHNkKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENTBfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksIFZTRDUwX3NkID0gc2QoSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q3NV9tZWFuID0gbWVhbihIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwgVlNENzVfc2QgPSBzZChIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZBU19tZWFuID0gbWVhbihWQVMsIG5hLnJtID1UKSwgVkFTX3NkID0gc2QoVkFTLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBPVF9tZWFuID0gbWVhbih0cmFuc0FjYywgbmEucm0gPVQpLCBPVF9zZCA9IHNkKHRyYW5zQWNjLCBuYS5ybSA9VCkpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gVlNBX21lYW46T1Rfc2QsIG5hbWVzX3RvID0gIk1lYXN1cmUiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVmFsdWUiKSAlPiUKICBkcGx5cjo6bXV0YXRlKG1lYW5TRCA9IGlmZWxzZShncmVwbCgiX21lYW4iLE1lYXN1cmUpLCJNIiwic2QiKSwKICAgICAgICAgICAgICAgIE1lYXN1cmUgPSBnc3ViKCJfbWVhbiIsIiIsTWVhc3VyZSksCiAgICAgICAgICAgICAgICBNZWFzdXJlID0gZ3N1YigiX3NkIiwiIixNZWFzdXJlKSwKICAgICAgICAgICAgICAgIEV0aW9sb2d5ID0gcGFzdGUoRXRpb2xvZ3ksbWVhblNELCBzZXAgPSAiXyIpLAogICAgICAgICAgICAgICAgU2V4ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgICBTZXggPT0gIkFsbCIgfiAiQWxsIFNwZWFrZXJzIiwKICAgICAgICAgICAgICAgICAgU2V4ID09ICJNIiB+ICJNYWxlIiwKICAgICAgICAgICAgICAgICAgU2V4ID09ICJGIiB+ICJGZW1hbGUiCiAgICAgICAgICAgICAgICApKSAlPiUKICBkcGx5cjo6c2VsZWN0KCFtZWFuU0QpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBFdGlvbG9neSwgdmFsdWVzX2Zyb20gPSAiVmFsdWUiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKE1lYXN1cmUgIT0gIlZTRDUwIikKCmd0RGF0YSAlPiUKICBndDo6Z3QoCiAgICByb3duYW1lX2NvbCA9ICJNZWFzdXJlIiwKICAgIGdyb3VwbmFtZV9jb2wgPSAiU2V4IiwKICApICU+JQogIGZtdF9udW1iZXIoCiAgICBjb2x1bW5zID0gJ0FsbCBFdGlvbG9naWVzX00nOlBEX3NkLAogICAgZGVjaW1hbHMgPSAyCiAgKSAlPiUKICB0YWJfc3Bhbm5lcigKICAgIGxhYmVsID0gIkFsbCBFdGlvbG9naWVzIiwKICAgIGNvbHVtbnMgPSBjKCdBbGwgRXRpb2xvZ2llc19NJywgJ0FsbCBFdGlvbG9naWVzX3NkJykKICApICU+JQogICAgdGFiX3NwYW5uZXIoCiAgICBsYWJlbCA9ICJBTFMiLAogICAgY29sdW1ucyA9IGMoQUxTX00sIEFMU19zZCkKICApICU+JQogIHRhYl9zcGFubmVyKAogICAgbGFiZWwgPSAiUEQiLAogICAgY29sdW1ucyA9IGMoUERfTSwgUERfc2QpCiAgKSAlPiUKICB0YWJfc3Bhbm5lcigKICAgIGxhYmVsID0gIkhEIiwKICAgIGNvbHVtbnMgPSBjKEhEX00sIEhEX3NkKQogICkgJT4lCiAgdGFiX3NwYW5uZXIoCiAgICBsYWJlbCA9ICJBdGF4aWMiLAogICAgY29sdW1ucyA9IGMoQXRheGljX00sIEF0YXhpY19zZCkKICApICU+JQogIGNvbHNfbGFiZWwoCiAgICAgJ0FsbCBFdGlvbG9naWVzX00nID0gIk0iLAogICAgICdBbGwgRXRpb2xvZ2llc19zZCcgPSAiU0QiLAogICAgIEFMU19NID0gIk0iLAogICAgIEFMU19zZCA9ICJTRCIsCiAgICAgUERfTSA9ICJNIiwKICAgICBQRF9zZCA9ICJTRCIsCiAgICAgSERfTSA9ICJNIiwKICAgICBIRF9zZCA9ICJTRCIsCiAgICAgQXRheGljX00gPSAiTSIsCiAgICAgQXRheGljX3NkID0gIlNEIgogICkgJT4lCiAgZ3RzYXZlKCJEZXNjcmlwdGl2ZXNUYWJsZS5odG1sIiwgcGF0aCA9ICJUYWJsZXMiKQoKYGBgCgojIyBPVCBNb2RlbApgYGB7cn0Kc2pQbG90Ojp0YWJfbW9kZWwoT1RfTW9kZWwxLE9UX01vZGVsMixPVF9Nb2RlbDMsIE9UX01vZGVsNCwgT1RfTW9kZWw1LCBPVF9Nb2RlbF9maW5hbCwKICAgICAgICAgICAgICAgICAgc2hvdy5jaSA9IEYsCiAgICAgICAgICAgICAgICAgIHAuc3R5bGUgPSAic3RhcnMiLAogICAgICAgICAgICAgICAgICBmaWxlID0gIlRhYmxlcy9PVCBNb2RlbHMuaHRtbCIpCmBgYAoKIyMgVkFTIE1vZGVsCmBgYHtyfQpzalBsb3Q6OnRhYl9tb2RlbChWQVNfTW9kZWwxLFZBU19Nb2RlbDIsVkFTX01vZGVsMywgVkFTX01vZGVsNCwgVkFTX01vZGVsNSwgVkFTX01vZGVsX2ZpbmFsLAogICAgICAgICAgICAgICAgICBzaG93LmNpID0gRiwKICAgICAgICAgICAgICAgICAgcC5zdHlsZSA9ICJzdGFycyIsCiAgICAgICAgICAgICAgICAgIGZpbGUgPSAiVGFibGVzL1ZBUyBNb2RlbHMuaHRtbCIpCmBgYAoKIyMgT1QgdnMuIFZBUwpgYGB7cn0Kc2pQbG90Ojp0YWJfbW9kZWwoT1RfVkFTX21vZGVsLE9UX1ZBU19maW5hbCwKICAgICAgICAgICAgICAgICAgc2hvdy5jaSA9IEYsCiAgICAgICAgICAgICAgICAgIHNob3cucmVmbHZsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgcC5zdHlsZSA9ICJzdGFycyIsCiAgICAgICAgICAgICAgICAgIGZpbGUgPSAiVGFibGVzL09UIGFuZCBWQVMgQ29tcGFyaXNvbi5odG1sIikKYGBgCgojIE1hbnVzY3JpcHQgRmlndXJlcwojIyBFeGFtcGxlIE1lYXN1cmVzCmBgYHtyfQpmb3JtYW50Q29sb3IgPC0gImdyZXkiCmZvcm1hbnRBbHBoYSA8LSAuOTUKbGluZUNvbG9yIDwtICJ3aGl0ZSIKbGluZUFscGhhIDwtIC44Cgp2b3dlbERhdGEgPC0gcmlvOjppbXBvcnQoIlByZXBwZWQgRGF0YS9Wb3dlbCBEYXRhLmNzdiIpICU+JQogIGRwbHlyOjpmaWx0ZXIoU3BlYWtlciA9PSAiQUY4IikKCiAgUGl0Y2hfUFJBQVQgPC0gbGlzdC5maWxlcyhwYXRoID0gcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwgc2VwID0gIiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICIuUGl0Y2giLCBpZ25vcmUuY2FzZSA9IFQpICU+JQogICAgcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwuLCBzZXAgPSAiIikgJT4lCiAgICByZWFkLmRlbGltKC4sIGhlYWRlciA9IEYpICU+JQogICAgZHBseXI6OnJlbmFtZShQaXRjaCA9IFYxKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoUGl0Y2ggPSBnc3ViKCItLXVuZGVmaW5lZC0tIixOQSxQaXRjaCksCiAgICAgICAgICAgICAgICAgIFBpdGNoID0gYXMubnVtZXJpYyhQaXRjaCkpCiAgCiAgRm9ybWFudHNfUFJBQVQgPC0gbGlzdC5maWxlcyhwYXRoID0gcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwgc2VwID0gIiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICJfRm9ybWFudCIsIGlnbm9yZS5jYXNlID0gVCkgJT4lCiAgICBwYXN0ZSgiUHJlcHBlZCBEYXRhL0V4YW1wbGUgRGF0YS8iLC4sIHNlcCA9ICIiKSAlPiUKICAgIHJlYWQuZGVsaW0oLiwgaGVhZGVyID0gVCkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KCFjKG5mb3JtYW50cywgQjEuSHouLCBCMi5Iei4sIEIzLkh6LiwgRjQuSHouLCBCNC5Iei4sIEY1Lkh6LiwgQjUuSHouKSkgJT4lCiAgICBkcGx5cjo6cmVuYW1lKFRpbWVfcyA9IHRpbWUucy4sCiAgICAgICAgICAgICAgICAgIEYxX0h6ID0gRjEuSHouLAogICAgICAgICAgICAgICAgICBGMl9IeiA9IEYyLkh6LiwKICAgICAgICAgICAgICAgICAgRjNfSHogPSBGMy5Iei4pICU+JQogICAgZHBseXI6Om11dGF0ZShGMV9IeiA9IGlmZWxzZShGMV9IeiA9PSAwLCBOQSwgRjFfSHopLAogICAgICAgICAgICAgICAgICBGMl9IeiA9IGlmZWxzZShGMl9IeiA9PSAwLCBOQSwgRjJfSHopLAogICAgICAgICAgICAgICAgICBGM19IeiA9IGlmZWxzZShGM19IeiA9PSAwLCBOQSwgRjNfSHopKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoRjFfSHogPSBhcy5udW1lcmljKEYxX0h6KSwKICAgICAgICAgICAgICAgICAgRjJfSHogPSBhcy5udW1lcmljKEYyX0h6KSwKICAgICAgICAgICAgICAgICAgRjNfSHogPSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoRjNfSHopKSwKICAgICAgICAgICAgICAgICAgVGltZV9tcyA9IFRpbWVfcyAvIDEwMDAsCiAgICAgICAgICAgICAgICAgIEYxX2tIeiA9IEYxX0h6IC8gMTAwMCwKICAgICAgICAgICAgICAgICAgRjJfa0h6ID0gRjJfSHogLyAxMDAwLAogICAgICAgICAgICAgICAgICBGM19rSHogPSBGM19IeiAvIDEwMDApICU+JQogICAgZHBseXI6OnNlbGVjdCghVGltZV9zKSAlPiUKICAgIGRwbHlyOjpyZWxvY2F0ZShUaW1lX21zLCAuYmVmb3JlID0gRjFfSHopICU+JQogICAgY2JpbmQoLixQaXRjaF9QUkFBVCkKICAKICBjIDwtIDIKICB3aGlsZShjIDwgTlJPVyhGb3JtYW50c19QUkFBVCkpewogICAgRm9ybWFudHNfUFJBQVQkRjFfSHpbY10gPC0gaWZlbHNlKGlzLm5hKEZvcm1hbnRzX1BSQUFUJEYxX0h6W2MtMV0pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShGb3JtYW50c19QUkFBVCRGMV9IeltjKzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYW50c19QUkFBVCRGMV9IeltjXSkKICAgIEZvcm1hbnRzX1BSQUFUJEYyX0h6W2NdIDwtIGlmZWxzZShpcy5uYShGb3JtYW50c19QUkFBVCRGMl9IeltjLTFdKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoRm9ybWFudHNfUFJBQVQkRjJfSHpbYysxXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWFudHNfUFJBQVQkRjJfSHpbY10pCiAgICBjIDwtIGMgKyAxCiAgfQogIHJtKGMpCiAgCiAgRm9ybWFudHNfUFJBQVQgPC0gRm9ybWFudHNfUFJBQVQgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShQaXRjaCkpICU+JQogICAgZHBseXI6Om11dGF0ZShGMV9tYWQgPSAoYWJzKEYxX0h6IC0gbWVkaWFuKEYxX0h6KSkvIG1hZChGMV9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgRjJfbWFkID0gKGFicyhGMl9IeiAtIG1lZGlhbihGMl9IeikpLyBtYWQoRjJfSHosIGNvbnN0YW50ID0gMS40ODI2KSkgPiAyLjUpICU+JQogICAgZHBseXI6OmZpbHRlcihGMV9tYWQgPT0gRkFMU0UgJiBGMl9tYWQgPT0gRkFMU0UpICU+JQogICAgZHBseXI6Om11dGF0ZShtRGlzdCA9IG1haGFsYW5vYmlzKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbE1lYW5zKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSBjb3YoY2JpbmQoLiRGMV9IeiwgLiRGMl9IeikpKSwKICAgICAgICAgICAgICAgICAgbURpc3Rfc2QgPSBhYnMoc2NhbGUobURpc3QsY2VudGVyID0gVCkpKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIobURpc3Rfc2QgPCAyKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoIWMoRjFfbWFkLCBGMl9tYWQsIG1EaXN0LCBtRGlzdF9zZCkpICU+JQogICAgZHBseXI6Om11dGF0ZShGMV96ID0gc2NhbGUoRjFfSHosIGNlbnRlciA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBGMl96ID0gc2NhbGUoRjJfSHosIGNlbnRlciA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBGM196ID0gc2NhbGUoRjNfSHosIGNlbnRlciA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBGMV9iID0gZW11Ujo6YmFyayhGMV9IeiksCiAgICAgICAgICAgICAgICAgIEYyX2IgPSBlbXVSOjpiYXJrKEYyX0h6KSwKICAgICAgICAgICAgICAgICAgRjNfYiA9IGVtdVI6OmJhcmsoRjNfSHopKQogIAogIHJtKFBpdGNoX1BSQUFUKQogIAogIAojIyBDb3JuZXIgRGlzcGVyc2lvbiAtLS0tCiAgd2VkZ2UgPC0gdm93ZWxEYXRhICU+JQogICAgZHBseXI6Omdyb3VwX2J5KFZvd2VsKSAlPiUKICAgIGRwbHlyOjpzdW1tYXJpemUobWVhbl9GMSA9IG1lYW4oRjFfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMiA9IG1lYW4oRjJfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMV96ID0gbWVhbihGMV96X3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjJfeiA9IG1lYW4oRjJfel90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YxX2IgPSBtZWFuKEYxX2JfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMl9iID0gbWVhbihGMl9iX3RlbXBNaWQpKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoVm93ZWwgPT0gInYiKQogICAgCiAgY29ybmVyX2RpcyA8LSB2b3dlbERhdGEgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKFZvd2VsICE9ICJ2IikgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoVm93ZWwpICU+JQogICAgZHBseXI6OnN1bW1hcml6ZShtZWFuX0YxID0gbWVhbihGMV90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YyID0gbWVhbihGMl90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YxX3ogPSBtZWFuKEYxX3pfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMl96ID0gbWVhbihGMl96X3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjFfYiA9IG1lYW4oRjFfYl90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YyX2IgPSBtZWFuKEYyX2JfdGVtcE1pZCkpICU+JQogICAgZHBseXI6Om11dGF0ZShWb3dlbF9FRCA9IHNxcnQoKG1lYW5fRjEtd2VkZ2UkbWVhbl9GMSleMiArIChtZWFuX0YyLXdlZGdlJG1lYW5fRjIpXjIpLAogICAgICAgICAgICAgICAgICBWb3dlbF9FRF96ID0gc3FydCgobWVhbl9GMV96LXdlZGdlJG1lYW5fRjFfeileMiArIChtZWFuX0YyX3otd2VkZ2UkbWVhbl9GMl96KV4yKSwKICAgICAgICAgICAgICAgICAgVm93ZWxfRURfYiA9IHNxcnQoKG1lYW5fRjFfYi13ZWRnZSRtZWFuX0YxX2IpXjIgKyAobWVhbl9GMl9iLXdlZGdlJG1lYW5fRjJfYileMikpCgogICAgCiMgUGxvdCBDb3JuZXIgRGlzcGVyc2lvbgogICAgICAjIENoYW5naW5nIHRvIElQQSBzeW1ib2xzCiAgICAgIGNvcm5lcl9kaXMgPC0gY29ybmVyX2RpcyAlPiUKICAgICAgICBkcGx5cjo6bXV0YXRlKFZvd2VsID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICAgIFZvd2VsID09ICJhZSIgfiAiw6YiLAogICAgICAgICAgVFJVRSB+IFZvd2VsCiAgICAgICAgKSkKICAgICAgCiAgICAgIHdlZGdlIDwtIHdlZGdlICU+JQogICAgICAgIGRwbHlyOjptdXRhdGUoVm93ZWwgPSBjYXNlX3doZW4oCiAgICAgICAgICBWb3dlbCA9PSAidiIgfiAiyowiLAogICAgICAgICAgVFJVRSB+IFZvd2VsCiAgICAgICAgKSkKICAgICAgCiAgICAgIENEcGxvdCA8LSBnZ3Bsb3QoYWVzKHg9RjJfYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1GMV9iKSwKICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRm9ybWFudHNfUFJBQVQsCiAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKyAKICAgICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLAogICAgICAgICAgICAgICAgIGFscGhhID0gZm9ybWFudEFscGhhLAogICAgICAgICAgICAgICAgIGNvbG9yID0gZm9ybWFudENvbG9yKSArIAogICAgICBnZW9tX2xpbmUoYWVzKHggPSBtZWFuX0YyX2IsCiAgICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fRjFfYiksCiAgICAgICAgICAgICAgICBkYXRhID0gY29ybmVyX2RpcyAlPiUKICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChWb3dlbDptZWFuX0YyX2IpICU+JQogICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKFZvd2VsID09ICJpIikgJT4lCiAgICAgICAgICAgICAgICAgIHJiaW5kKC4sd2VkZ2UpLAogICAgICAgICAgICAgICAgY29sb3IgPSBsaW5lQ29sb3IsCiAgICAgICAgICAgICAgICBzaXplID0gMS41LAogICAgICAgICAgICAgICAgYWxwaGEgPSBsaW5lQWxwaGEpICsKICAgICAgZ2VvbV9saW5lKGFlcyh4ID0gbWVhbl9GMl9iLAogICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX0YxX2IpLAogICAgICAgICAgICAgICAgZGF0YSA9IGNvcm5lcl9kaXMgJT4lCiAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QoVm93ZWw6bWVhbl9GMl9iKSAlPiUKICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihWb3dlbCA9PSAiYSIpICU+JQogICAgICAgICAgICAgICAgICByYmluZCguLHdlZGdlKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gbGluZUNvbG9yLAogICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAgICAgICAgICAgICAgIGFscGhhID0gbGluZUFscGhhKSArCiAgICAgIGdlb21fbGluZShhZXMoeCA9IG1lYW5fRjJfYiwKICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9GMV9iKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBjb3JuZXJfZGlzICU+JQogICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KFZvd2VsOm1lYW5fRjJfYikgJT4lCiAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoVm93ZWwgPT0gIsOmIikgJT4lCiAgICAgICAgICAgICAgICAgIHJiaW5kKC4sd2VkZ2UpLAogICAgICAgICAgICAgICAgY29sb3IgPSBsaW5lQ29sb3IsCiAgICAgICAgICAgICAgICBzaXplID0gMS41LAogICAgICAgICAgICAgICAgYWxwaGEgPSBsaW5lQWxwaGEpICsKICAgICAgZ2VvbV9saW5lKGFlcyh4ID0gbWVhbl9GMl9iLAogICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX0YxX2IpLAogICAgICAgICAgICAgICAgZGF0YSA9IGNvcm5lcl9kaXMgJT4lCiAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QoVm93ZWw6bWVhbl9GMl9iKSAlPiUKICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihWb3dlbCA9PSAidSIpICU+JQogICAgICAgICAgICAgICAgICByYmluZCguLHdlZGdlKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gbGluZUNvbG9yLAogICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAgICAgICAgICAgICAgIGFscGhhID0gbGluZUFscGhhKSArCiAgICAgIGdlb21fcG9pbnQoYWVzKHggPSBtZWFuX0YyX2IsCiAgICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX0YxX2IsCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gVm93ZWwpLAogICAgICAgICAgICAgICAgIGRhdGEgPSBjb3JuZXJfZGlzICU+JQogICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KFZvd2VsOm1lYW5fRjJfYikgJT4lCiAgICAgICAgICAgICAgICAgIHJiaW5kKC4sd2VkZ2UpLAogICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgc2l6ZSA9IDUpICsKICAgICAgc2NhbGVfeV9yZXZlcnNlKCkgKwogICAgICBzY2FsZV94X3JldmVyc2UoKSArCiAgICAgIHRoZW1lX2NsYXNzaWMoKSArIGxhYnModGl0bGUgPSBwYXN0ZSgiQ29ybmVyIERpc3BlcnNpb24iKSkgKyB4bGFiKCJGMiAoYmFyaykiKSArIHlsYWIoIkYxIChiYXJrKSIpICsKICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpICsKICAgICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJhIiA9ICIjMUFBRDc3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLDpiIgPSAiIzEyNzlCNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaSIgPSAiI0ZGQkYwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidSIgPSAiI0ZENzg1MyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiyowiID0gIiNCRjMxNzgiKSkKICAgIENEcGxvdAogICAgCiAgICAgIHJtKGNvcm5lcl9kaXMsIHdlZGdlKQogICAgICAKIyMgVm93ZWwgU3BhY2UgQXJlYSAtLS0tCiAgVlNBX2Nvb3JkcyA8LSB2b3dlbERhdGEgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKFZvd2VsICE9ICJ2IikgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoVm93ZWwpICU+JQogICAgZHBseXI6OnN1bW1hcml6ZShtZWFuX0YxID0gbWVhbihGMV90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YyID0gbWVhbihGMl90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YxX3ogPSBtZWFuKEYxX3pfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMl96ID0gbWVhbihGMl96X3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjFfYiA9IG1lYW4oRjFfYl90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YyX2IgPSBtZWFuKEYyX2JfdGVtcE1pZCkpIAogIAojIyMgUGxvdHRpbmcgVlNBCiAgICBWU0FfY29vcmRzIDwtIFZTQV9jb29yZHMgJT4lCiAgICAgICAgZHBseXI6Om11dGF0ZShWb3dlbCA9IGNhc2Vfd2hlbigKICAgICAgICAgIFZvd2VsID09ICJhZSIgfiAiw6YiLAogICAgICAgICAgVFJVRSB+IFZvd2VsCiAgICAgICAgKSkKICAgIAogICAgVlNBcGxvdCA8LSBnZ3Bsb3QoYWVzKHggPSBGMl9iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGMV9iKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGb3JtYW50c19QUkFBVCwKICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgICBhbHBoYSA9IGZvcm1hbnRBbHBoYSwKICAgICAgICAgICAgICAgICBjb2xvciA9IGZvcm1hbnRDb2xvcikgKyAKICAgICAgZ2VvbV9wb2x5Z29uKGFlcyh4ID0gbWVhbl9GMl9iLAogICAgICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX0YxX2IpLAogICAgICAgICAgICAgICAgICAgZGF0YSA9IFZTQV9jb29yZHMsCiAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGxpbmVBbHBoYSwKICAgICAgICAgICAgICAgICAgIGNvbG9yID0gbGluZUNvbG9yLAogICAgICAgICAgICAgICAgICAgZmlsbD1OQSwKICAgICAgICAgICAgICAgICAgIHNpemUgPSAxLjUpICsKICAgICAgZ2VvbV9wb2ludChhZXMoeCA9IG1lYW5fRjJfYiwKICAgICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fRjFfYiwKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBWb3dlbCksCiAgICAgICAgICAgICAgICAgZGF0YSA9IFZTQV9jb29yZHMsCiAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICBzaXplID0gNSkgKwogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsgbGFicyh0aXRsZSA9ICJWU0EiKSArIHhsYWIoIkYyIChiYXJrKSIpICsgeWxhYigiRjEgKGJhcmspIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkgKwogICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImEiID0gIiMxQUFENzciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIsOmIiA9ICIjMTI3OUI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpIiA9ICIjRkZCRjAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1IiA9ICIjRkQ3ODUzIikpCiAgICBWU0FwbG90CiAgCiAgcm0oVlNBX2Nvb3JkcykKICAKIyMgQXV0b21hdGljIFZTQSAtLS0tCiAgUmVmRGF0YSA8LSBvcGVueGxzeDo6cmVhZC54bHN4KCJQcmVwcGVkIERhdGEvRXhhbXBsZSBEYXRhL0hpbGxlbmJyYW5kIFZvd2VsIERhdGEueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gIkhpbGxlbmJyYW5kIFZvd2VsIERhdGEiKSAlPiUKICBkcGx5cjo6cmVuYW1lKFNwZWFrZXIgPSAxLAogICAgICAgICAgICAgICAgRjFfSHogPSA0LAogICAgICAgICAgICAgICAgRjJfSHogPSA1KSAlPiUKICBkcGx5cjo6c2VsZWN0KFNwZWFrZXIsIEYxX0h6LCBGMl9IeikgJT4lCiAgZHBseXI6OmZpbHRlcighZ3JlcGwoImJ8ZyIsU3BlYWtlcikpICU+JQogIGRwbHlyOjptdXRhdGUoRjEgPSBlbXVSOjpiYXJrKEYxX0h6KSwKICAgICAgICAgICAgICAgIEYyID0gZW11Ujo6YmFyayhGMl9IeiksCiAgICAgICAgICAgICAgICBTZXggPSBpZmVsc2UoZ3JlcGwoIm0iLFNwZWFrZXIpLCJNIiwiRiIpLAogICAgICAgICAgICAgICAgVm93ZWwgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgIGdyZXBsKHBhdHRlcm4gPSAidXciLCBTcGVha2VyKSB+ICJ1IiwKICAgICAgICAgICAgICAgICAgZ3JlcGwocGF0dGVybiA9ICJhaCIsIFNwZWFrZXIpIH4gImEiLAogICAgICAgICAgICAgICAgICBncmVwbChwYXR0ZXJuID0gIml5IiwgU3BlYWtlcikgfiAiaSIsCiAgICAgICAgICAgICAgICAgIGdyZXBsKHBhdHRlcm4gPSAidWgiLCBTcGVha2VyKSB+ICJ2IiwKICAgICAgICAgICAgICAgICAgZ3JlcGwocGF0dGVybiA9ICJhZSIsIFNwZWFrZXIpIH4gImFlIiwKICAgICAgICAgICAgICAgICAgZ3JlcGwocGF0dGVybiA9ICJhdyIsIFNwZWFrZXIpIH4gIsmUIiwKICAgICAgICAgICAgICAgICAgZ3JlcGwocGF0dGVybiA9ICJlaCIsIFNwZWFrZXIpIH4gIsmbIiwKICAgICAgICAgICAgICAgICAgZ3JlcGwocGF0dGVybiA9ICJlciIsIFNwZWFrZXIpIH4gIsmdIiwKICAgICAgICAgICAgICAgICAgZ3JlcGwocGF0dGVybiA9ICJlaSIsIFNwZWFrZXIpIH4gImXJqiIsCiAgICAgICAgICAgICAgICAgIGdyZXBsKHBhdHRlcm4gPSAiaWgiLCBTcGVha2VyKSB+ICLJqiIsCiAgICAgICAgICAgICAgICAgIGdyZXBsKHBhdHRlcm4gPSAib2EiLCBTcGVha2VyKSB+ICJvIiwKICAgICAgICAgICAgICAgICAgZ3JlcGwocGF0dGVybiA9ICJvbyIsIFNwZWFrZXIpIH4gIsqKIgogICAgICAgICAgICAgICAgKSkgJT4lCiAgZHBseXI6OmZpbHRlcighaXMubmEoVm93ZWwpKSAlPiUKICBkcGx5cjo6c2VsZWN0KCFTcGVha2VyKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoU2V4LCBWb3dlbCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShGMV9SZWYgPSBtZWFuKEYxKSwKICAgICAgICAgICAgICAgICAgIEYyX1JlZiA9IG1lYW4oRjIpKSAlPiUKICAgIGRwbHlyOjp1bmdyb3VwKCkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKFNleCA9PSAiRiIpICU+JQogICAgZHBseXI6OnNlbGVjdCghYyhTZXgsIFZvd2VsKSkKICAKICBhdXRvVlNBIDwtIEZvcm1hbnRzX1BSQUFUICU+JQogICAgZHBseXI6OnNlbGVjdChGMV9iLEYyX2IpICU+JQogICAgc3RhdHM6OmttZWFucyguLCBjZW50ZXJzID0gUmVmRGF0YSwgbnN0YXJ0ID0gMTAwLCBpdGVyLm1heCA9IDEwMDApICU+JQogICAgLiRjZW50ZXJzICU+JQogICAgYXMuZGF0YS5mcmFtZSgpCiAgCiAgY29udmV4Q29vcmRzIDwtIGF1dG9WU0EgJT4lCiAgICBhcy5tYXRyaXgoKSAlPiUKICAgIGdyRGV2aWNlczo6Y2h1bGwoKQogIAogIGF1dG9Db252ZXggPC0gYXV0b1ZTQSAlPiUKICAgICAgICBzbGljZShjb252ZXhDb29yZHMpCiAgCiMjIyBQbG90dGluZyBBdXRvbWF0aWMgVlNBCiAgICBhdXRvVlNBcGxvdCA8LSBnZ3Bsb3QoYWVzKHggPSBGMl9iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGMV9iKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGb3JtYW50c19QUkFBVCwKICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgICBhbHBoYSA9IGZvcm1hbnRBbHBoYSwKICAgICAgICAgICAgICAgICBjb2xvciA9IGZvcm1hbnRDb2xvcikgKyAKICAgICAgZ2VvbV9wb2x5Z29uKGFlcyh4ID0gRjJfYiwKICAgICAgICAgICAgICAgICAgICAgICB5ID0gRjFfYiksCiAgICAgICAgICAgICAgICAgICBkYXRhID0gYXV0b0NvbnZleCwKICAgICAgICAgICAgICAgICAgIGFscGhhID0gbGluZUFscGhhLAogICAgICAgICAgICAgICAgICAgY29sb3IgPSBsaW5lQ29sb3IsCiAgICAgICAgICAgICAgICAgICBmaWxsPU5BLAogICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSkgKwogICAgICBnZW9tX3BvaW50KGFlcyh4ID0gRjJfYiwKICAgICAgICAgICAgICAgICAgICAgeSA9IEYxX2IpLAogICAgICAgICAgICAgICAgIGRhdGEgPSBhdXRvVlNBLAogICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgc2l6ZSA9IDIpICsKICAgICAgc2NhbGVfeV9yZXZlcnNlKCkgKwogICAgICBzY2FsZV94X3JldmVyc2UoKSArCiAgICAgICNndWlkZXMoY29sb3IgPSBGQUxTRSkgKwogICAgICB0aGVtZV9jbGFzc2ljKCkgKwogICAgICBsYWJzKHRpdGxlID0gIkF1dG9tYXRpYyBWU0EiKSArCiAgICAgIHhsYWIoIkYyIChiYXJrKSIpICsKICAgICAgeWxhYigiRjEgKGJhcmspIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKICAgIGF1dG9WU0FwbG90CiAgCiAgcm0oVlNBX2Nvb3JkcykKICAKIyMgSHVsbCAtLS0tCgojIyMgUGxvdHRpbmcgSHVsbAogICAgICBjb252ZXhDb29yZHMgPC0gRm9ybWFudHNfUFJBQVQgJT4lCiAgICAgICAgZHBseXI6OnNlbGVjdChGMV9iLCBGMl9iKSAlPiUKICAgICAgICBhcy5tYXRyaXgoKSAlPiUKICAgICAgICBnckRldmljZXM6OmNodWxsKCkKICAgICAgY29udmV4IDwtIEZvcm1hbnRzX1BSQUFUICU+JQogICAgICAgIHNsaWNlKGNvbnZleENvb3JkcykKCiAgICAgIGh1bGxQbG90IDwtIGdncGxvdChhZXMoRjJfYiwgRjFfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRm9ybWFudHNfUFJBQVQpICsKICAgICAgICBnZW9tX3BvaW50KHNoYXBlID0gMjEsCiAgICAgICAgICAgICAgICAgYWxwaGEgPSBmb3JtYW50QWxwaGEsCiAgICAgICAgICAgICAgICAgY29sb3IgPSBmb3JtYW50Q29sb3IpICsKICAgICAgICBnZW9tX3BvbHlnb24oZGF0YSA9IGNvbnZleCwKICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAuNSwKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyNzlCNSIsCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBOQSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSkgKwogICAgICAgIHNjYWxlX3lfcmV2ZXJzZSgpICsKICAgICAgICBzY2FsZV94X3JldmVyc2UoKSArCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsgbGFicyh0aXRsZSA9ICJWU0EgSHVsbCIpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQogICAgICBodWxsUGxvdAogICAgCiAgCiMjIFZvd2VsIFNwYWNlIERlbnNpdHkgLS0tLQoKIyBCYXJrIE5vcm1hbGl6ZWQgRGVuc2l0eSAtLS0tCiMgc2VsZWN0aW5nIHRoZSBiYW5kd2lkdGgKSF9ocGkgPC0ga3M6OkhwaSh4ID0gRm9ybWFudHNfUFJBQVRbLGMoIkYyX2IiLCJGMV9iIildLCBwaWxvdCA9ICJzYW1zZSIsIHByZSA9ICJzY2FsZSIsIGJpbm5lZCA9IFQpCgojIGNvbXB1dGUgMmQga2RlCmsgPC0ga2RlKHggPSBGb3JtYW50c19QUkFBVFssYygiRjJfYiIsIkYxX2IiKV0sCiAgICAgICAgIEggPSBIX2hwaSwKICAgICAgICAgYmlubmVkID0gVCwKICAgICAgICAgZ3JpZHNpemUgPSAyNTApCgojZGVuc2l0eSA8LSBrW1siZXN0aW1hdGUiXV0KCiMgQmVmb3JlIHdlIGNhbiBwbG90IHRoZSBkZW5zaXR5IGVzdGltYXRlIHdlIG5lZWQgdG8gbWVsdCBpdCBpbnRvIGxvbmcgZm9ybWF0Cm1hdC5tZWx0ZWQgPC0gZGF0YS50YWJsZTo6bWVsdChrJGVzdGltYXRlKQpuYW1lcyhtYXQubWVsdGVkKSA8LSBjKCJ4IiwgInkiLCAiZGVuc2l0eSIpCgojIFdlIG5lZWQgdG8gYWRkIHR3byBtb3JlIGNvbHVtcyB0byBwcmVzZXJ2ZSB0aGUgYXhlcyB1bml0cwptYXQubWVsdGVkJEYyLmIgPC0gcmVwKGskZXZhbC5wb2ludHNbWzFdXSwgdGltZXMgPSBucm93KGskZXN0aW1hdGUpKQptYXQubWVsdGVkJEYxLmIgPC0gcmVwKGskZXZhbC5wb2ludHNbWzJdXSwgZWFjaCA9IG5yb3coayRlc3RpbWF0ZSkpCm1hdC5tZWx0ZWQkZGVuc2l0eSA8LSBzY2FsZXM6OnJlc2NhbGUobWF0Lm1lbHRlZCRkZW5zaXR5LCB0byA9IGMoMCwgMSkpCgojIFZTRCAtIDI1Cm5WU0RfMjUgPC0gbWF0Lm1lbHRlZCAlPiUKICBkcGx5cjo6ZmlsdGVyKGRlbnNpdHkgPiAuMjUpICU+JQogIGRwbHlyOjpzZWxlY3QoRjIuYixGMS5iLCBkZW5zaXR5KSAlPiUKICBkcGx5cjo6cmVuYW1lKERlbnNpdHkgPSBkZW5zaXR5KQoKY29udmV4Q29vcmRzIDwtIG5WU0RfMjUgJT4lCiAgZHBseXI6OnNlbGVjdChGMi5iLCBGMS5iKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICAjZ3JEZXZpY2VzOjp4eS5jb29yZHMoKSAlPiUKICBnckRldmljZXM6OmNodWxsKCkKbmNvbnZleF8yNSA8LSBuVlNEXzI1ICU+JQogIHNsaWNlKGNvbnZleENvb3JkcykKCiMgVlNEIC0gNzUKblZTRF83NSA8LSBtYXQubWVsdGVkICU+JQogIGRwbHlyOjpmaWx0ZXIoZGVuc2l0eSA+IC43NSkgJT4lCiAgZHBseXI6OnNlbGVjdChGMi5iLEYxLmIsIGRlbnNpdHkpICU+JQogIGRwbHlyOjpyZW5hbWUoRGVuc2l0eSA9IGRlbnNpdHkpCgpjb252ZXhDb29yZHMgPC0gblZTRF83NSAlPiUKICBkcGx5cjo6c2VsZWN0KEYyLmIsIEYxLmIpICU+JQogIGFzLm1hdHJpeCgpICU+JQogIGdyRGV2aWNlczo6Y2h1bGwoKQpuY29udmV4Xzc1IDwtIG5WU0RfNzUgJT4lCiAgc2xpY2UoY29udmV4Q29vcmRzKQoKIyBQbG90dGluZyBaIE5vcm1hbGl6ZWQgVlNEIAogICAgcmYgPC0gY29sb3JSYW1wUGFsZXR0ZShyZXYoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDExLCAiU3BlY3RyYWwiKSkpCiAgICByIDwtIHJmKDMyKQogICAgCiAgICBwbG90RGF0YSA8LSBtYXQubWVsdGVkICU+JQogICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6cmVuYW1lKERlbnNpdHkgPSBkZW5zaXR5KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6Om11dGF0ZShWU0RsYWJlbCA9IGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2l0eSA8IC4yNSB+ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zaXR5ID4gLjI1ICYmIERlbnNpdHkgPCAuNzUgfiAiVlNEMjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiVlNENzUiCiAgICAgICAgICAgICAgICAgICAgICAgICkpCmdlb20udGV4dC5zaXplIDwtIDIKICAgIFZTRHBsb3QgPC0gZ2dwbG90KGRhdGEgPSBwbG90RGF0YSwKICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gRjIuYiwKICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gRjEuYiwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gRGVuc2l0eSkpICsgCiAgICAgIGdlb21fdGlsZSgpICsgCiAgICAgIHNjYWxlX2ZpbGxfdmlyaWRpc19jKCkgKwogICAgICBzY2FsZV94X3JldmVyc2UoZXhwYW5kID0gYygwLCAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSByb3VuZChzZXEobWluKG1hdC5tZWx0ZWQkRjIuYiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChtYXQubWVsdGVkJEYyLmIpLCBieSA9IDIpKSkgKwogICAgICBzY2FsZV95X3JldmVyc2UoZXhwYW5kID0gYygwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHJvdW5kKHNlcShtaW4obWF0Lm1lbHRlZCRGMS5iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgobWF0Lm1lbHRlZCRGMS5iKSwgYnkgPSAyKSkpICsgCiAgICAgIHlsYWIoIkYxIChiYXJrKSIpICsgeGxhYigiRjIgKGJhcmspIikgKwogICAgICBsYWJzKHRpdGxlID0gIlZTRCBIdWxsIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkgKwogICAgICBnZW9tX3BvbHlnb24oZGF0YSA9IG5jb252ZXhfMjUsIGFscGhhID0gbGluZUFscGhhLCBjb2xvciA9IGxpbmVDb2xvciwgc2l6ZSA9IDEuNSwgZmlsbCA9IE5BLCBsaW5ldHlwZSA9IDIpICsKICAgICAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBuY29udmV4Xzc1LCBhbHBoYSA9IGxpbmVBbHBoYSwgY29sb3IgPSBsaW5lQ29sb3IsIHNpemUgPSAxLjUsIGZpbGwgPSBOQSwgbGluZXR5cGUgPSAxKSArCiAgICAjIFZTRCAyNSBMYWJlbAogICAgICBhbm5vdGF0ZShnZW9tID0gImN1cnZlIiwKICAgICAgICAgICAgICAgeCA9IDYuOSwgeSA9IDEuNysuNSwKICAgICAgICAgICAgICAgeGVuZCA9IDguNSwgeWVuZCA9IDMuNSwKICAgICAgICAgICAgICAgY3VydmF0dXJlID0gLS4zLAogICAgICAgICAgICAgICBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpLAogICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIpICsKICAgICAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwKICAgICAgICAgICAgICAgeCA9IDcuNSwgeSA9IDEuNywKICAgICAgICAgICAgICAgbGFiZWwgPSBkZXBhcnNlKGJxdW90ZShWU0RbMjVdKSksCiAgICAgICAgICAgICAgIGhqdXN0ID0gImNlbnRlciIsCiAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgcGFyc2U9VFJVRSkgKwogICAgIyBWU0QgNzUgTGFiZWwKICAgICAgYW5ub3RhdGUoZ2VvbSA9ICJjdXJ2ZSIsCiAgICAgICAgICAgICAgIHggPSA3LjUsIHkgPSA3LjUtLjUsCiAgICAgICAgICAgICAgIHhlbmQgPSAxMS4zNSwgeWVuZCA9IDUuNSwKICAgICAgICAgICAgICAgY3VydmF0dXJlID0gLjMsCiAgICAgICAgICAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgyLCAibW0iKSksCiAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIikgKwogICAgICBhbm5vdGF0ZShnZW9tID0gInRleHQiLAogICAgICAgICAgICAgICB4ID0gNywgeSA9IDcuNSwKICAgICAgICAgICAgICAgbGFiZWwgPSBkZXBhcnNlKGJxdW90ZShWU0RbNzVdKSksCiAgICAgICAgICAgICAgIGhqdXN0ID0gImNlbnRlciIsCiAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgcGFyc2UgPSBUUlVFKQogICAgICAjZ2VvbV90ZXh0Y3VydmUoZGF0YSA9IGRhdGEuZnJhbWUoeCA9IDEwLjM4MjQ1MiwgeGVuZCA9IDguMzEzNTE1LCB5ID0gMi44NzQ5NjcsIHllbmQgPSA0LjEyNzkxOSwgRGVuc2l0eSA9IDEpLAogICAgICAjICAgICAgICAgICBhZXMoeCwgeSwgeGVuZCA9IHhlbmQsIHllbmQgPSB5ZW5kKSwKICAgICAgIyAgICAgICAgICAgaGp1c3QgPSAwLjUsCiAgICAgICMgICAgICAgICAgIHZqdXN0ID0gLTEsCiAgICAgICMgICAgICAgICAgIGN1cnZhdHVyZSA9IDAsCiAgICAgICMgICAgICAgICAgIHNpemUgPSBnZW9tLnRleHQuc2l6ZSwKICAgICAgIyAgICAgICAgICAgbGFiZWwgPSAiVlNEIDI1IiwKICAgICAgIyAgICAgICAgICAgdGV4dF9vbmx5ID0gVCwKICAgICAgIyMgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgIyAgICAgICAgICAgZmlsbCA9ICJ3aGl0ZSIsCiAgICAgICAjICAgICAgICAgIHJpY2ggPSBUUlVFKSArIAogICAgIFZTRHBsb3QKCiMgQ29tYmluZWQgUGxvdAogICAgIAogICAgIHJvdzEgPC0gVlNBcGxvdCArIGF1dG9WU0FwbG90ICsgQ0RwbG90ICsKICAgICAgICBwYXRjaHdvcms6OnBsb3RfbGF5b3V0KGd1aWRlcyA9ICdjb2xsZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzKSAmIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdyaWdodCcpCiAgICAgcm93MiA8LSBodWxsUGxvdCArIFZTRHBsb3QgKwogICAgICAgIHBhdGNod29yazo6cGxvdF9sYXlvdXQoZ3VpZGVzID0gJ2NvbGxlY3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpICYgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ3JpZ2h0JykKICAgICAKICAgICBtZWFzdXJlc1Bsb3QgPC0gcm93MSAvIHJvdzIgKyBwYXRjaHdvcms6OnBsb3RfbGF5b3V0KGhlaWdodHMgPSBjKDEvMiwgMS8yKSwgYnlyb3cgPSBGQUxTRSkKICAgICBtZWFzdXJlc1Bsb3QKICAgICAKICAgICBybShyb3cxLCByb3cyKQoKZ2dzYXZlKGZpbGVuYW1lID0gIlBsb3RzL01lYXN1cmVzLnBuZyIsCiAgICAgICBwbG90ID0gbWVhc3VyZXNQbG90LAogICAgICAgaGVpZ2h0ID0gNS41LAogICAgICAgd2lkdGggPSA4LAogICAgICAgc2NhbGUgPSAuOCkKCmBgYAoKIyMgRmlsdGVyaW5nIFByb2Nlc3MKYGBge3J9CmZvcm1hbnRBbHBoYSA8LSAuMjAKbXlQYWwgPC0gYygiIzEyNzlCNSIsIiMyRDJEMzciKQoKUGl0Y2hfUFJBQVQgPC0gbGlzdC5maWxlcyhwYXRoID0gcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwgc2VwID0gIiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICIuUGl0Y2giLCBpZ25vcmUuY2FzZSA9IFQpICU+JQogICAgcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwuLCBzZXAgPSAiIikgJT4lCiAgICByZWFkLmRlbGltKC4sIGhlYWRlciA9IEYpICU+JQogICAgZHBseXI6OnJlbmFtZShQaXRjaCA9IFYxKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoUGl0Y2ggPSBnc3ViKCItLXVuZGVmaW5lZC0tIixOQSxQaXRjaCksCiAgICAgICAgICAgICAgICAgIFBpdGNoID0gYXMubnVtZXJpYyhQaXRjaCkpCgpGb3JtYW50c19QUkFBVCA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXN0ZSgiUHJlcHBlZCBEYXRhL0V4YW1wbGUgRGF0YS8iLCBzZXAgPSAiIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIl9Gb3JtYW50IiwgaWdub3JlLmNhc2UgPSBUKSAlPiUKICAgIHBhc3RlKCJQcmVwcGVkIERhdGEvRXhhbXBsZSBEYXRhLyIsLiwgc2VwID0gIiIpICU+JQogICAgcmVhZC5kZWxpbSguLCBoZWFkZXIgPSBUKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoIWMobmZvcm1hbnRzLCBCMS5Iei4sIEIyLkh6LiwgQjMuSHouLCBGNC5Iei4sIEI0Lkh6LiwgRjUuSHouLCBCNS5Iei4pKSAlPiUKICAgIGRwbHlyOjpyZW5hbWUoVGltZV9zID0gdGltZS5zLiwKICAgICAgICAgICAgICAgICAgRjFfSHogPSBGMS5Iei4sCiAgICAgICAgICAgICAgICAgIEYyX0h6ID0gRjIuSHouLAogICAgICAgICAgICAgICAgICBGM19IeiA9IEYzLkh6LikgJT4lCiAgICBkcGx5cjo6bXV0YXRlKEYxX0h6ID0gaWZlbHNlKEYxX0h6ID09IDAsIE5BLCBGMV9IeiksCiAgICAgICAgICAgICAgICAgIEYyX0h6ID0gaWZlbHNlKEYyX0h6ID09IDAsIE5BLCBGMl9IeiksCiAgICAgICAgICAgICAgICAgIEYzX0h6ID0gaWZlbHNlKEYzX0h6ID09IDAsIE5BLCBGM19IeikpICU+JQogICAgZHBseXI6Om11dGF0ZShGMV9IeiA9IGFzLm51bWVyaWMoRjFfSHopLAogICAgICAgICAgICAgICAgICBGMl9IeiA9IGFzLm51bWVyaWMoRjJfSHopLAogICAgICAgICAgICAgICAgICBGM19IeiA9IHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhGM19IeikpLAogICAgICAgICAgICAgICAgICBUaW1lX21zID0gVGltZV9zIC8gMTAwMCwKICAgICAgICAgICAgICAgICAgRjFfa0h6ID0gRjFfSHogLyAxMDAwLAogICAgICAgICAgICAgICAgICBGMl9rSHogPSBGMl9IeiAvIDEwMDAsCiAgICAgICAgICAgICAgICAgIEYzX2tIeiA9IEYzX0h6IC8gMTAwMCwKICAgICAgICAgICAgICAgICAgRjFfYiA9IGVtdVI6OmJhcmsoRjFfSHopLAogICAgICAgICAgICAgICAgICBGMl9iID0gZW11Ujo6YmFyayhGMl9IeiksCiAgICAgICAgICAgICAgICAgIEYzX2IgPSBlbXVSOjpiYXJrKEYzX0h6KSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KCFUaW1lX3MpICU+JQogICAgZHBseXI6OnJlbG9jYXRlKFRpbWVfbXMsIC5iZWZvcmUgPSBGMV9IeikgJT4lCiAgICBjYmluZCguLFBpdGNoX1BSQUFUKQogIAogIGMgPC0gMgogIHdoaWxlKGMgPCBOUk9XKEZvcm1hbnRzX1BSQUFUKSl7CiAgICBGb3JtYW50c19QUkFBVCRGMV9IeltjXSA8LSBpZmVsc2UoaXMubmEoRm9ybWFudHNfUFJBQVQkRjFfSHpbYy0xXSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKEZvcm1hbnRzX1BSQUFUJEYxX0h6W2MrMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hbnRzX1BSQUFUJEYxX0h6W2NdKQogICAgRm9ybWFudHNfUFJBQVQkRjJfSHpbY10gPC0gaWZlbHNlKGlzLm5hKEZvcm1hbnRzX1BSQUFUJEYyX0h6W2MtMV0pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShGb3JtYW50c19QUkFBVCRGMl9IeltjKzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYW50c19QUkFBVCRGMl9IeltjXSkKICAgIGMgPC0gYyArIDEKICB9CiAgcm0oYykKICAKICAjIFJhdyBGb3JtYW50cyAtLS0tCiAgZjEgPC0gZ2dwbG90KGFlcyh4PUYyX2IsCiAgICAgICAgICAgICAgICAgICB5PUYxX2IpLAogICAgICAgICAgICAgICBkYXRhID0gRm9ybWFudHNfUFJBQVQpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgY29sb3IgPSBteVBhbFsyXSkgKwogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15UGFsKSArCiAgICAgIHRoZW1lX2NsYXNzaWMoKSArIGxhYnModGl0bGUgPSBwYXN0ZSgiUmF3IEZvcm1hbnQgVmFsdWVzIikpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxLAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKQogICAgCiMgU3RlcCAjMTogVm9pY2VkIFNlZ21lbnRzIC0tLS0KICAgIHBsb3REYXRhIDwtIEZvcm1hbnRzX1BSQUFUICU+JQogICAgICAgICAgICAgICAgICAgZHBseXI6Om11dGF0ZShpc091dGxpZXIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgIGlzLm5hKFBpdGNoKSB+ICJSZW1vdmVkIiwKICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJSZXRhaW5lZCIKICAgICAgICAgICAgICAgICAgICkpCiAgICBmMiA8LSBnZ3Bsb3QoZGF0YSA9IHBsb3REYXRhLAogICAgICAgICAgICAgICAgIGFlcyh4ID0gRjJfYiwKICAgICAgICAgICAgICAgICAgICAgeSA9IEYxX2IsCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaXNPdXRsaWVyKSkgKyAKICAgICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBkYXRhID0gcGxvdERhdGEgJT4lCiAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGlzT3V0bGllciA9PSAiUmVtb3ZlZCIpKSArCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgZGF0YSA9IHBsb3REYXRhICU+JQogICAgICAgICAgICAgZHBseXI6OmZpbHRlcihpc091dGxpZXIgPT0gIlJldGFpbmVkIikpICsKICAgICAgc2NhbGVfeV9yZXZlcnNlKCkgKwogICAgICBzY2FsZV94X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBteVBhbCkgKwogICAgICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHRpdGxlID0gcGFzdGUoIlN0ZXAgIzE6XG5Wb2ljZWQgU2VnbWVudHMiKSkgKwogICAgICB4bGFiKCJGMiAoYmFyaykiKSArCiAgICAgIHlsYWIoIkYxIChiYXJrKSIpICsKICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsCiAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpCiAgICAKIyBTdGVwIDI6IE1BRCAtLS0tCiAgICBwbG90RGF0YSA8LSBGb3JtYW50c19QUkFBVCAlPiUKICAgICAgZHBseXI6OmZpbHRlcighaXMubmEoUGl0Y2gpKSAlPiUKICAgICAgZHBseXI6Om11dGF0ZShGMV9tYWQgPSAoYWJzKEYxX0h6IC0gbWVkaWFuKEYxX0h6KSkvIG1hZChGMV9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgICBGMl9tYWQgPSAoYWJzKEYyX0h6IC0gbWVkaWFuKEYyX0h6KSkvIG1hZChGMl9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgICBpc091dGxpZXIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgICBGMV9tYWQgPT0gVFJVRSB8IEYyX21hZCA9PSBUUlVFIH4gIlJlbW92ZWQiLAogICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJSZXRhaW5lZCIKICAgICAgICAgICAgICAgKSkKICAgIAogICAgZjMgPC0gZ2dwbG90KGRhdGEgPSBwbG90RGF0YSwKICAgICAgICAgICAgICAgICBhZXMoeCA9IEYyX2IsCiAgICAgICAgICAgICAgICAgICAgIHkgPSBGMV9iLAogICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGlzT3V0bGllcikpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgZGF0YSA9IHBsb3REYXRhICU+JQogICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihpc091dGxpZXIgPT0gIlJlbW92ZWQiKSkgKwogICAgICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGRhdGEgPSBwbG90RGF0YSAlPiUKICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaXNPdXRsaWVyID09ICJSZXRhaW5lZCIpKSArCiAgICAgIHNjYWxlX3lfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfeF9yZXZlcnNlKCkgKwogICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsKICAgICAgbGFicyh0aXRsZSA9IHBhc3RlKCJTdGVwICMyOlxuTWVkaWFuIEFic29sdXRlIERldmlhdGlvbiIpKSArCiAgICAgIHhsYWIoIkYyIChiYXJrKSIpICsKICAgICAgeWxhYigiRjEgKGJhcmspIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwKICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkKICAgIAojIFN0ZXAgMzogTWFoYWxhbmhvYmlzIERpc3RhbmNlIC0tLS0KICBwbG90RGF0YSA8LSBGb3JtYW50c19QUkFBVCAlPiUKICAgICAgZHBseXI6OmZpbHRlcighaXMubmEoUGl0Y2gpKSAlPiUKICAgICAgZHBseXI6Om11dGF0ZShGMV9tYWQgPSAoYWJzKEYxX0h6IC0gbWVkaWFuKEYxX0h6KSkvIG1hZChGMV9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgICBGMl9tYWQgPSAoYWJzKEYyX0h6IC0gbWVkaWFuKEYyX0h6KSkvIG1hZChGMl9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSkgJT4lCiAgICAgIGRwbHlyOjpmaWx0ZXIoRjFfbWFkID09IEZBTFNFICYgRjJfbWFkID09IEZBTFNFKSAlPiUKICAgICAgZHBseXI6Om11dGF0ZShtRGlzdCA9IG1haGFsYW5vYmlzKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbE1lYW5zKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSBjb3YoY2JpbmQoLiRGMV9IeiwgLiRGMl9IeikpKSwKICAgICAgICAgICAgICAgICAgbURpc3Rfc2QgPSBhYnMoc2NhbGUobURpc3QsY2VudGVyID0gVCkpLAogICAgICAgICAgICAgICAgICBpc091dGxpZXIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgbURpc3Rfc2QgPCAyIH4gIlJldGFpbmVkIiwKICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIlJlbW92ZWQiCiAgICAgICAgICAgICAgICAgICkpCiAgICAKICAgIGY0IDwtIGdncGxvdChkYXRhID0gcGxvdERhdGEsCiAgICAgICAgICAgICAgICAgYWVzKHggPSBGMl9iLAogICAgICAgICAgICAgICAgICAgICB5ID0gRjFfYiwKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBpc091dGxpZXIpKSArIAogICAgICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGRhdGEgPSBwbG90RGF0YSAlPiUKICAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaXNPdXRsaWVyID09ICJSZW1vdmVkIikpICsKICAgICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBkYXRhID0gcGxvdERhdGEgJT4lCiAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGlzT3V0bGllciA9PSAiUmV0YWluZWQiKSkgKwogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15UGFsKSArCiAgICAgIHRoZW1lX2NsYXNzaWMoKSArIGxhYnModGl0bGUgPSBwYXN0ZSgiU3RlcCAjMzpcbk1haGFsYW5vYmlzIERpc3RhbmNlIikpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxLAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKQogICAgCiMgRmluYWwgRm9ybWFudHMgLS0tLQogICAgcGxvdERhdGEgPC0gRm9ybWFudHNfUFJBQVQgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShQaXRjaCkpICU+JQogICAgZHBseXI6Om11dGF0ZShGMV9tYWQgPSAoYWJzKEYxX0h6IC0gbWVkaWFuKEYxX0h6KSkvIG1hZChGMV9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgRjJfbWFkID0gKGFicyhGMl9IeiAtIG1lZGlhbihGMl9IeikpLyBtYWQoRjJfSHosIGNvbnN0YW50ID0gMS40ODI2KSkgPiAyLjUpICU+JQogICAgZHBseXI6OmZpbHRlcihGMV9tYWQgPT0gRkFMU0UgJiBGMl9tYWQgPT0gRkFMU0UpICU+JQogICAgZHBseXI6Om11dGF0ZShtRGlzdCA9IG1haGFsYW5vYmlzKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbE1lYW5zKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSBjb3YoY2JpbmQoLiRGMV9IeiwgLiRGMl9IeikpKSwKICAgICAgICAgICAgICAgICAgbURpc3Rfc2QgPSBhYnMoc2NhbGUobURpc3QsY2VudGVyID0gVCkpKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIobURpc3Rfc2QgPCAyKQogICAgCiAgICBmNSA8LSBnZ3Bsb3QoYWVzKHg9RjJfYiwKICAgICAgICAgICAgICAgICAgICAgeT1GMV9iKSwKICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcGxvdERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKyAKICAgICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBjb2xvciA9IG15UGFsWzJdKSArIAogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsgbGFicyh0aXRsZSA9IHBhc3RlKCJGaW5hbCBGb3JtYW50IFZhbHVlcyIpKSArIHhsYWIoIkYyIChiYXJrKSIpICsgeWxhYigiRjEgKGJhcmspIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQogICAgCiMgQ29taWJpbmcgcGxvdHMKICAgIGZpbHRlcmVkUGxvdCA8LSBmMSArIGYyICsgZjMgKyBmNCArIGY1ICsgcGF0Y2h3b3JrOjpndWlkZV9hcmVhKCkgKwogICAgICBwYXRjaHdvcms6OnBsb3RfbGF5b3V0KGd1aWRlcyA9ICdjb2xsZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzKQogICAgZmlsdGVyZWRQbG90CiAgICAKICAgIGdnc2F2ZShwbG90ID0gZmlsdGVyZWRQbG90LCAiUGxvdHMvRmlsdGVyZWQgRm9ybWFudHMucG5nIiwKICAgICAgICAgICBoZWlnaHQgPSA2LAogICAgICAgICAgIHdpZHRoID0gOCwKICAgICAgICAgICB1bml0cyA9ICJpbiIsCiAgICAgICAgICAgc2NhbGUgPSAuOSkKICAKYGBgCgojIyBPVCB2cy4gVkFTCmBgYHtyfQpwbG90RGF0YV9JbnQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpmaWx0ZXIoIWdyZXBsKCJfcmVsIiwgU3BlYWtlcikpICU+JQogIGRwbHlyOjpncm91cF9ieShTcGVha2VyKSAlPiUKICBkcGx5cjo6bXV0YXRlKHNlZ01pbiA9IGJhc2U6Om1pbihWQVMsIHRyYW5zQWNjKSwKICAgICAgICAgICAgICAgIHNlZ01heCA9IGJhc2U6Om1heChWQVMsIHRyYW5zQWNjKSwKICAgICAgICAgICAgICAgIHJhdGluZ0F2ZyA9IG1lYW4oVkFTLCB0cmFuc0FjYywgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgIFNwZWFrZXIgPSBhcy5mYWN0b3IoU3BlYWtlciksCiAgICAgICAgICAgICAgICBFdGlvbG9neSA9IGFzLmZhY3RvcihFdGlvbG9neSkpICU+JQogIGFycmFuZ2Uoc2VnTWF4KQoKbXlfcGFsIDwtIGMoIiNmMjY0MzAiLCAiIzI3MkQyRCIsIiMyNTZlZmYiKQojIFdpdGggYSBiaXQgbW9yZSBzdHlsZQpwbG90X0ludCA8LSBnZ3Bsb3QocGxvdERhdGFfSW50KSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gZmN0X2lub3JkZXIoU3BlYWtlciksCiAgICAgICAgICAgICAgICAgICB4ZW5kID0gU3BlYWtlciwKICAgICAgICAgICAgICAgICAgIHkgPSBzZWdNaW4sCiAgICAgICAgICAgICAgICAgICB5ZW5kID0gc2VnTWF4LAogICAgICAgICAgICAgICAgICAgY29sb3IgPSBFdGlvbG9neSkpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gU3BlYWtlciwKICAgICAgICAgICAgICAgICB5ID0gVkFTLAogICAgICAgICAgICAgICAgIGNvbG9yID0gRXRpb2xvZ3kpLAogICAgICAgICAgICAgI2NvbG9yID0gbXlfcGFsWzFdLAogICAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgICBzaGFwZSA9IDE5KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IFNwZWFrZXIsCiAgICAgICAgICAgICAgICAgeSA9IHRyYW5zQWNjLAogICAgICAgICAgICAgICAgIGNvbG9yID0gRXRpb2xvZ3kpLAogICAgICAgICAgICAgI2NvbG9yID0gbXlfcGFsWzJdLAogICAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgICBzaGFwZSA9IDE1KSArCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNwZWVjaCBJbnRlbGxpZ2liaWxpdHkiKSArCiAgZ2d0aXRsZSgiU3BlZWNoIEludGVsbGlnaWJpbGl0eSIpICsKICB5bGltKGMoMCwxMDApKQpwbG90X0ludAoKbXlQYWwgPC0gYygiIzFBQUQ3NyIsICIjMTI3OUI1IiwgIiNGRkJGMDAiLCAiI0ZENzg1MyIsICIjQkYzMTc4IikKbXlTaGFwZXMgPC0gYygxNiwgMTgsIDE3LCAxNSkKCnNjYXR0ZXIxIDwtIGdncGxvdChwbG90RGF0YV9JbnQsCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gVkFTLAogICAgICAgICAgICAgICAgICAgICAgeSA9IHRyYW5zQWNjLAogICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBFdGlvbG9neSwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gRXRpb2xvZ3ksCiAgICAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9IEV0aW9sb2d5KSkgKwogIGdlb21fcG9pbnQoKSArCiAgI2dlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLDEwMCksIHlsaW0gPSBjKDAsMTAwKSkgKwogIGxhYnMoeCA9ICJJbnRlbGxpZ2liaWxpdHkgKFZBUykiLCB5ID0gIkludGVsbGlnaWJpbGl0eSAoT1QpIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBteVBhbCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBteVNoYXBlcykgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEsCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpCgpzY2F0dGVyMiA8LSBnZ3Bsb3QocGxvdERhdGFfSW50LAogICAgICAgICAgICAgICAgICBhZXMoeCA9IFZBUywKICAgICAgICAgICAgICAgICAgICAgIHkgPSB0cmFuc0FjYywKICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gRXRpb2xvZ3ksCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IEV0aW9sb2d5LAogICAgICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSBFdGlvbG9neSkpICsKICAjZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwxMDApLCB5bGltID0gYygwLDEwMCkpICsKICBsYWJzKHggPSAiSW50ZWxsaWdpYmlsaXR5IChWQVMpIiwgeSA9ICJJbnRlbGxpZ2liaWxpdHkgKE9UKSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gbXlTaGFwZXMpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKQoKY29tYmluZWRTY2F0dGVyIDwtIGdnYXJyYW5nZShzY2F0dGVyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2F0dGVyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24ubGVnZW5kID0gRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMSkKY29tYmluZWRTY2F0dGVyCgpnZ3NhdmUoZmlsZW5hbWUgPSAiUGxvdHMvT1QgYW5kIFZBUyBTY2F0dGVycGxvdC5wbmciLAogICAgICAgcGxvdCA9IGNvbWJpbmVkU2NhdHRlciwKICAgICAgIGhlaWdodCA9IDIsCiAgICAgICB3aWR0aCA9IDYsCiAgICAgICB1bml0cyA9ICJpbiIsCiAgICAgICBzY2FsZSA9IDEpCgpybShzY2F0dGVyMSwgc2NhdHRlcjIsIGNvbWJpbmVkU2NhdHRlcikKYGBgCgpNb2RlbCBTY2F0dGVycGxvdApgYGB7cn0KbW9kZWxGaWd1cmVEYXRhIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFncmVwbCgiX3JlbCIsU3BlYWtlcikpICU+JQogIGRwbHlyOjpzZWxlY3QoU3BlYWtlciwgRXRpb2xvZ3ksIFNleCwgVlNBX2IsIHZvd2VsX0VEX2IsIEh1bGxfYiwgSHVsbF9iVlNEXzI1LCBIdWxsX2JWU0RfNzUsIFZBUywgdHJhbnNBY2MpICU+JQogIGRwbHlyOjptdXRhdGUoU3BlYWtlciA9IGFzLmZhY3RvcihTcGVha2VyKSwKICAgICAgICAgICAgICAgIEV0aW9sb2d5ID0gYXMuZmFjdG9yKEV0aW9sb2d5KSwKICAgICAgICAgICAgICAgIFNleCA9IGFzLmZhY3RvcihTZXgpKSAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKGNvbHMgPSBWQVM6dHJhbnNBY2MsIG5hbWVzX3RvID0gIkludFR5cGUiLCB2YWx1ZXNfdG8gPSAiSW50IikgJT4lCiAgZHBseXI6Om11dGF0ZShJbnRUeXBlID0gY2FzZV93aGVuKAogICAgSW50VHlwZSA9PSAidHJhbnNBY2MiIH4gIk9UIiwKICAgIFRSVUUgfiAiVkFTIgogICksCiAgICAgICAgICAgICAgICBJbnRUeXBlID0gYXMuZmFjdG9yKEludFR5cGUpKQoKeWxhYmVsIDwtICJJbnRlbGxpZ2liaWxpdHkiCm15UGFsIDwtIGMoIiMyRDJEMzciLCAiIzEyNzlCNSIpCm15UGFsU2hhcGUgPC0gYygxOSwgMSkKClZTQSA8LSBtb2RlbEZpZ3VyZURhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBJbnQsCiAgICAgIGNvbG9yID0gSW50VHlwZSwKICAgICAgc2hhcGUgPSBJbnRUeXBlLAogICAgICBsaW5ldHlwZSA9IEludFR5cGUpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVlNBIChCYXJrIl4yKiIpIikpICsKICB5bGFiKHlsYWJlbCkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGFzcGVjdC5yYXRpbz0xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15UGFsKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IG15UGFsU2hhcGUpICsKICBsYWJzKGNvbG9yPSJJbnRlbGxpZ2liaWxpdHkgVHlwZSIsCiAgICAgICBzaGFwZSA9ICJJbnRlbGxpZ2liaWxpdHkgVHlwZSIsCiAgICAgICBsaW5ldHlwZSA9ICJJbnRlbGxpZ2liaWxpdHkgVHlwZSIpCgpkaXNwIDwtIG1vZGVsRmlndXJlRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gSW50LAogICAgICBjb2xvciA9IEludFR5cGUsCiAgICAgIHNoYXBlID0gSW50VHlwZSwKICAgICAgbGluZXR5cGUgPSBJbnRUeXBlKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKCJDb3JuZXIgRGlzcGVyc2lvbiAoQmFyaykiKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBteVBhbCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBteVBhbFNoYXBlKSArCiAgbGFicyhjb2xvcj0iSW50ZWxsaWdpYmlsaXR5IFR5cGUiLAogICAgICAgc2hhcGUgPSAiSW50ZWxsaWdpYmlsaXR5IFR5cGUiLAogICAgICAgbGluZXR5cGUgPSAiSW50ZWxsaWdpYmlsaXR5IFR5cGUiKQoKSHVsbCA8LSBtb2RlbEZpZ3VyZURhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gSW50LAogICAgICBjb2xvciA9IEludFR5cGUsCiAgICAgIHNoYXBlID0gSW50VHlwZSwKICAgICAgbGluZXR5cGUgPSBJbnRUeXBlKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZTQSJbSHVsbF0qIiAoQmFyayJeMioiKSIpKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gbXlQYWxTaGFwZSkgKwogIGxhYnMoY29sb3I9IkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIHNoYXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIGxpbmV0eXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIikKCnZzZDI1IDwtIG1vZGVsRmlndXJlRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSBJbnQsCiAgICAgIGNvbG9yID0gSW50VHlwZSwKICAgICAgc2hhcGUgPSBJbnRUeXBlLAogICAgICBsaW5ldHlwZSA9IEludFR5cGUpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVlNEIlsyNV0qIiAoQmFyayJeMioiKSIpKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gbXlQYWxTaGFwZSkgKwogIGxhYnMoY29sb3I9IkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIHNoYXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIGxpbmV0eXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIikKCnZzZDc1IDwtIG1vZGVsRmlndXJlRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfNzUsCiAgICAgIHkgPSBJbnQsCiAgICAgIGNvbG9yID0gSW50VHlwZSwKICAgICAgc2hhcGUgPSBJbnRUeXBlLAogICAgICBsaW5ldHlwZSA9IEludFR5cGUpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVlNEIls3NV0qIiAoQmFyayJeMioiKSIpKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gbXlQYWxTaGFwZSkgKwogIGxhYnMoY29sb3I9IkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIHNoYXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIGxpbmV0eXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIikKCiMgQ3JlYXRpbmcgT1QgU2NhdHRlcnBsb3QgRmlndXJlCgpzY2F0dGVyIDwtIFZTQSArIGRpc3AgKyBwYXRjaHdvcms6Omd1aWRlX2FyZWEoKSArIEh1bGwgKyB2c2QyNSArIHZzZDc1ICsKICBwYXRjaHdvcms6OnBsb3RfbGF5b3V0KGd1aWRlcyA9ICdjb2xsZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzKQpzY2F0dGVyIAoKZ2dzYXZlKCJQbG90cy9Nb2RlbEZpZ3VyZS5wbmciLCBzY2F0dGVyLAogICAgICAgaGVpZ2h0ID0gNCwKICAgICAgIHdpZHRoID0gNiwKICAgICAgIHVuaXRzID0gImluIiwKICAgICAgIHNjYWxlID0gMS4xKQpgYGAKCiMgTGlzdGVuZXIgRGVtb2dyYXBoaWMgSW5mb3JtYXRpb24KYGBge3J9CgpMaXN0ZW5lckRlbW8gPC0gTGlzdGVuZXJzICU+JQogIGZ1cm5pdHVyZTo6dGFibGUxKGFnZSwgZ2VuZGVyLCByYWNlLCBldGhuaWNpdHkpCgpMaXN0ZW5lckRlbW8KCmBgYAoKIyBTcGVha2VyIERlbW9ncmFwaGljcwoKYGBge3J9CgpTcGVha2VyRGVtbyA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChjKFNwZWFrZXIsIFNleCwgRXRpb2xvZ3kpKQoKQWdlcyA8LSByaW86OmltcG9ydCgiUHJlcHBlZCBEYXRhL1NwZWFrZXIgQWdlcy54bHN4IikKClNwZWFrZXJEZW1vIDwtIGZ1bGxfam9pbihTcGVha2VyRGVtbywgQWdlcywgYnkgPSAiU3BlYWtlciIpCgpTcGVha2VyRGVtb0luZm8gPC0gU3BlYWtlckRlbW8gJT4lCiAgZnVybml0dXJlOjp0YWJsZTEoU2V4LCBFdGlvbG9neSwgQWdlLCBuYS5ybSA9IEYpCgpTcGVha2VyRGVtb0luZm8KClNwZWFrZXJEZW1vICU+JQogIGRwbHlyOjpzdW1tYXJpemUobWVhbl9hZ2UgPSBtZWFuKEFnZSwgbmEucm0gPSBUKSwgYWdlX3NkID0gc2QoQWdlLCBuYS5ybSA9IFQpLCBhZ2VfcmFuZ2UgPSByYW5nZShBZ2UsIG5hLnJtID0gVCkpCgpgYGAKCg==